레이블이 scheme인 게시물을 표시합니다. 모든 게시물 표시
레이블이 scheme인 게시물을 표시합니다. 모든 게시물 표시

2010년 2월 23일 화요일

PLT scheme slideshow 에서 한글 출력시 첫 단어 이후 글씨들이 높낮이가 다른점

그냥 폰트지정하면 된다.
괜히 궁금해져서 문서 뒤져봤네.

예제코드.
폰트지정하는 코드가 핵심.



#lang slideshow

(current-main-font "malgun")

(slide
#:title "안녕"
(t (number->string (current-font-size)))
(t "폰트 높낮이가 왜 다르냐")
(t "정말 눈에 거슬린다")
'next
(t "폰트를 지정해주니 해결됐엉"))



2010년 2월 16일 화요일

mzscheme 아주 간단히 임베딩 해서 빌드만 해봤다.

s7 을 ogre 에 대강 붙여보니 잘 돌더라.
뭐 이정도만 되도 내가 쓰기엔 문제 없는데 괜히 오버해서 mzscheme 을 구경해봤다.

scheme. common lisp 을 모두 쳐도 PLT scheme 만큼 유지보수가 잘되고 윈도까지 지원하는게 드물어서 그냥 붙여본건데.. 흠 용량도 크고 붙이기도 쉽지 않고 그다지 끌리질 않네. 차라리 ecl 쪽이 좀더 끌리는듯.


문서는
http://docs.plt-scheme.org/inside/index.html
를참고했고

빌드에 쓴 CMakeLists.txt 는

cmake_minimum_required(VERSION 2.8)

if(WIN32)
# PLT 경로
set(PLTDIR "C:/Program Files/PLT" CACHE PATH "PLT scheme dir")
# -I, CFAGS, LDFLAGS 등 기본설정
include_directories("${PLTDIR}/include")
link_directories("${PLTDIR}/lib/msvc")
link_libraries(libmzsch3m_6ncc9s)
# 빌드후 테스팅을 편하게 하려고 dll 복사해줬다
configure_file("${PLTDIR}/lib/libmzsch3m_6ncc9s.dll" "${CMAKE_CURRENT_BINARY_DIR}" COPYONLY)
else()
# 지금은 윈도우 사용중이라.
endif()

# 필수
add_definitions(/DMZ_PRECISE_GC=1)
# base.i 가 소스리스트에 포함되어있고
add_executable(a a.cpp base.i)
# base.i 는 요 커맨드에 의해서 생성.
# PLT 문서는 .c 를 쓰는데 그럴경우 cmake 에서 좀 피곤하게 돌기때문에 .i 로 바꿨다.
add_custom_command(
OUTPUT base.i
COMMAND ${PLTDIR}/mzc --c-mods base.i ++lib scheme/base
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
)



그리고 테스트로작성한 a.cpp 는 ( 위 문서의 코드를 그냥 베낀 정도의 코드 )
[code cpp]
#include "scheme.h"
#include "base.i" // mzc 가 생성한놈 원 문서는 .c 를 쓰지만 난 빌드편하게 하려다 보니 .i 썼다

static int run(Scheme_Env* e, int argc, char* argv[]);


int main(int argc, char* argv[])
{
// main 을 후킹해서 돌아가는 스타일
return scheme_main_setup(1, run, argc, argv);
}


// 아.. 드럽다. s7 이나 tiny_scheme 같은 경우는 대강 문서 보고 헤더
// 구경하면서 쓰는게 가능한데 이놈은 그렇질 못하다. 가비지콜렉션
// 때문인데... 흠. 문서를 좀더 읽기 전에 달려들었다간 낭패보기 쉽겠다.
static int run(Scheme_Env* e, int argc, char* argv[])
{
Scheme_Object* v;

MZ_GC_DECL_REG(2);
MZ_GC_VAR_IN_REG(0, e);
MZ_GC_VAR_IN_REG(1, v);
MZ_GC_REG();

declare_modules(e); // base.i 에서 나온거

v = scheme_intern_symbol("scheme/base");
scheme_namespace_require(v);

v = scheme_eval_string("(+ 1 2 3)", e);
if(SCHEME_INTP(v))
printf("result: %d\n", SCHEME_INT_VAL(v));

MZ_GC_UNREG();
return 0;
}
[/code]

참고로 이렇게 떨어진 a.exe 는 Release 빌드시 대략 556KB, 저 따라다녀야 하는 dll 은 2.5 MB

2010년 1월 26일 화요일

s7, 간단한 scheme 구현

https://ccrma.stanford.edu/software/snd/snd/s7.html
https://ccrma.stanford.edu/software/snd/

http://www.reddit.com/r/programming/comments/arvdl/choosing_a_game_scripting_language/

중 s7 언급을 보고 알았다.
다음에 스크립트 올릴일 있으면 tinyscheme 말고 이놈 한번 써보자.

후에 이게 기억나길..

2009년 6월 24일 수요일

tinyscheme 윈도에서 빌드하기위한 cmake 스크립트

이전에는 리눅스에서 놀아본거고

이번에는 tinyscheme 을 윈도에서 빌드하려고 하니 좀 성가시네. msvc 버전문제 인가?
그래서 간단하게 CMakeLists.txt 를 만들어봤다. 물론! 빌드되는것까지만 확인해본 것이니
좀더 둘러보고 써야겠지만. 어쨌거나 적어둔다.

펼쳐두기..





2010/01/22 추가. msvc9 에서 빌드해본거. 이전에 적은거랑 별 차이는 없다.

펼쳐두기..










2009년 5월 13일 수요일

beamer, latex 로 프리젠테이션 자료 급조하기

보통 문서작업은 org-mode doxygen 으로 얼렁뚱땅 하는 편인데 빔으로 쏴야 할경우엔 둘다 좀 안어울린다. 오피스계열은 ms 건 오픈쪽이건 써본적도 없고 쓸줄도 모르니 아예 논외고.. 그래서 찾다보니 beamer 에 도착을 했네.

먼저 내가 원하는건 그냥 위쪽에 제목 적히고 아래쪽에 적당히 몇줄 나열만 되면 끝. 내가 문서질에 소양이 있는놈도 아니고 말잘하는놈도 아니니 뭐 그냥 만들라길래 만들었다 정도의 생색내기만 가능하면 된다.

beamer 말고도 다른놈들 몇가지 있는데.. 각종 위키시스템들도 이런기능은 지원하고 있고.. 뭐 어쨌건 tex 는 전혀 모르지만 beamer 를 고르게 됐고 불편없이 쓰게됐다. 다른 후보들은 생략. (음 이건 기억해둘까.. 맨처음엔 구글 docs 가 제공하는 놈을 써봤는데 이거 정말 끔찍하게시리 불편하고 한글지원 개판(스페이스오동작)등등 쓸놈이 못되더라. 대실망하고 웹기반 툴들은 아예 제꼈다. 아 그리고 PLT scheme유사기능(slideshow)이 있는데 이건 체크못해봤다. 예전에 한번 살펴볼려고 기억해둔건데 흠. 나중에 다시 볼일이 생기면 이놈을 꼭 검토해보자. 예제 링크도 적어둬야지.)

tex 의 간단한 사용법은 http://en.wikibooks.org/wiki/LaTeX 에서 익혔다. ktug 에 한글문서도 있는데 대강 비슷한 내용이고 아무래도 위키쪽이 읽기는 더 편하지. 어쨌건 내가 원하는건 책을쓰거나 도표/수식으로 채워진 그럴듯한 페이퍼를 만드는게 아니니 명령어 몇개만 대강 알아두고 이스케이프할 문자 몇개 알아두고.. 하면 충분했다.

beamer 사용법은 http://latex-beamer.sourceforge.net/ 만 가지고는 좀 부족하고 패키지에 딸려오는 문서... (http://en.wikibooks.org/wiki/LaTeX/Presentations 에도 링크가 있다.) 를 읽어야 했는데.. 사실 읽지 않고 그냥 적당히 필요한걸 구글링 하니 잘 뜨더라. 내가 쓴건 최소한의 사용법에 allowframebreaks 옵션 더쓴것 뿐.

음.. 코드도 좀 적어둘려고 했는데 좀 바쁘네.
대강 기억해둘만한것만 적어둔다.
  • 한글쓰는게 좀 어렵던데.. ktug 봐도 잘 모르겠고 어쨌건 내 시스템(리눅스)에 kotex 패키지만 깔아주고 \usepackage{kotex} 해주면 되더라.
  • beamer 쓰려면 \documentclass{beamer} 로 시작. 이 클래스라는건 tex 가 어떤식으로 문서를 뽑아낼지 결정하는 중요한 요소같군. 다른놈들도 많던데 관심밖
  • 테마지정이 좀 애매하더라. 어떤 테마가 있고 어떤 모양인지 한눈에 보여주는 문서를 못찾았다. 그냥 적당히 몇개 넣다보니 Madrid 테마 정도가 맘에 드네. 컬러도 따로 지정할수 있다던데 관심없다.
  • frame 이란 용어가 나오는데 이게 화면에 보여지는 한 페이지를 말한다.
  • 제목을 보여주는 페이지는 요리 만들자. \titlepage 가 author 나 title 에 시간까지 적당히 박은 그럴듯한 페이지를 뽑아준다.
    \begin{frame}
      \titlepage
    \end{frame}
  • 내가 만든 허접한 자료는 모든 페이지가 제목한줄, 아이템 몇개나열. 이게 전부다. 이런 모양을 만드려면
    \begin{frame}
      \frametitle{프레임제목}
      \begin{itemize}
        \item 킹
        \item 왕
        \item 짱
      \end{itemize}
    \end{frame}
  • itemize 외에 description 도 자주 쓰이더라.
  • 위처럼 만들다 보면 한페이지를 넘어가는데 (특히나 나는 다른데서 왕창 copy-paste 해온거라) 이경우엔 allowframebreaks 옵션만 주면 된다. 으악! 이게 제일 맘에 들었다.
    \begin{frame}[allowframebreaks]
  • 출력된 pdf 에 목차를 박아넣고 싶으면 적당히 section 이나 subsecion 을 깔아두자. 이게 프레임에 보이지는 않는데.. 아마 beamer 클래스가 아니면 결과물엗도 보이겠지?
  • 링크를 걸기 위해선 url 패키지를 써봤다. 뭐 사실 링크는 의미없지만 적절히 이스케이프를 잘 해준다길래.
  • 제기랄! 글로만 좀 부족하더라. 그림을 박아봤다. 그래픽스 패키지 추가하고( beamer 는 이게 기본인거 같던데? 흠. )
    \includegraphics[width=0.9\linewidth]{foo}
  • 이미지와 .tex 가 섞이니 짱나더라. images 라는 서브폴더에서 그림을 찾도록 해줬다.
    \graphicspath{{./images/}}
  • 음 역시나 성의없는 pt 라.. 제목한줄에 이미지한장 큰거. 이런 모양이 자꾸 반복되더라. tex 에 매크로같은게 있나 해서 찾아보니 newcommand 라는게 나오네. 적당히 만들어봤다. 이게 상당히 추한데.. 더 나은방법이 있을거란 기분이 들지만 뭐 땜질에는 충분하다.
    \newcommand{\singleimageframe}[2]{
      \begin{frame}
        \frametitle{#1}
        \begin{center}
          \includegraphics[width=0.9\linewidth]{#2}
        \end{center}
      \end{frame}
    }
  • 위 커맨드를 만들고 아래처럼 세줄적으면 프레임 세장이 간단히 튀어나온다. 우왕ㅋ굳ㅋ 인자의미도 적어둘까.. 첫번째는 프레임타이틀. 두번째는 박을 이미지 파일명
    \singleimageframe{헬로우}{hello}
    \singleimageframe{갓댐}{damn}
    \singleimageframe{블라블라}{blahblah}
  • .tex 가 덩치가 커지면 좀 골때리니까 input 으로 적절히 여러파일로 나눠서 작성하면 관리가 좀더 편하더라.

beamer 는 이것외에도 아주 많은 기능을 지원하는 놈이던데 나한테는 전혀 필요없는 기능들이다. 그래도 혹시 모르니 \pause 등 몇몇 이펙트 넣는것은 읽어두면 좋을것 같다.

2008년 8월 7일 목요일

tinyscheme 간단한 용도에 임베딩해서 사용할수 있는 BSD 스타일 라이센스의 scheme 인터프리터 구현체

http://tinyscheme.sourceforge.net

문서가 좀 그런면이 있는데 인터페이스 함수들이 워낙 간단하니 적당히 쓰면 잘 돌더라. 심각한 스크립팅이 필요하면 다른걸 찾아보자. 원래 ecl 을 써볼려고 했는데 이건 덩치가 너무 크고 라이센스도 빡세더라. 간단한 일에 부담없이 쓰기엔 요놈이 아주 좋아보인다.


//
// 아래 소스 빌드할때 써먹은 CMakeLists.txt
// 별거없고 USE_INTERFACE 를 디파인했다는것만 기억해두자
// 그외 여러가지 조정할게 많아 보이는데 아직 모름.
//

// PROJECT(play-with-tinyscheme)
// INCLUDE_DIRECTORIES(/home/yoonkn/tmp/tinyscheme1.39)
// LINK_DIRECTORIES(/home/yoonkn/tmp/tinyscheme1.39)
// LINK_LIBRARIES(tinyscheme)
// ADD_DEFINITIONS(-DUSE_INTERFACE)
//
// ADD_EXECUTABLE(a a.cpp)



extern "C" {
#include "scheme-private.h"
#include "scheme.h"
}
#include <unistd.h>
#include <iostream>
using namespace std;

static void die(const char* msg) {puts(msg); exit(-1);}
static pointer c_add(scheme* sc, pointer args);


int main()
{
// 초기화. 전역이 아니라 멀티쓰레드간에 써도 안심?
scheme* sc = scheme_init_new();
if(!sc) die("init failed");

// display 등으로 출력되는 값이 튀어나오는 곳이겠군.
scheme_set_output_port_file(sc, stdout);

// scheme 코드를 실행하려면 load_string 이나 load_file 을 쓰자
// scheme.c 를 보니 init.scm 등을 먼저 읽고 시작하는게 바른
// 사용방법인듯 하다. load_string 류 함수는 코드 실행후 실행여부를
// retcode 에, 평가된 값을 value 에 담아주는 모냥이다.
sc->vptr->load_string(sc, "(define foo \"fuckshit\")");
if(sc->retcode != 0) die("exec failed");

// scheme 내의 값을 읽으려면 요렇게. 심벌만 넣어서 실행하고
// .value 를 읽어오면 되는듯
sc->vptr->load_string(sc, "foo");
const char* foo_value = sc->vptr->string_value(sc->value);
puts(foo_value);

// C 쪽에서 만든 덧셈 함수를 scheme 인터프리터에 추가하자.
sc->vptr->scheme_define(sc,
sc->global_env,
sc->vptr->mk_symbol(sc, "c-add"),
sc->vptr->mk_foreign_func(sc, c_add));

// c_add 함 불러보고 리턴값을 찍어보자
sc->vptr->load_string(sc, "(c-add 111 222)");
if(sc->retcode != 0) die("fucked");
printf("(c-add ..) return : %d\n", sc->vptr->ivalue(sc->value));

// 이번엔 반대로 scheme 쪽에서 함수를 만들어보자
sc->vptr->load_string(sc, "(define (scm-add a b) (+ a b))");
if(sc->retcode != 0) die("fucked");

// 이걸 C 쪽에서 부르자.. 음 물론 scheme 코드 만들어서 load_string
// 써도 되겠지만.. C 레벨에서.. 어라? 인터페이스가 안빠져있네
// scheme_call 이란 함수가 있긴 한데 외부로 노출된 함수는 아니네
// 음.. 뭐 일단 내가 원했던 내용까지는 파악이 됐으니 걍 여기까지



// 정리. 그런데 scheme_init_new 는 안쪽에서 sc 를 malloc 해서
// 주는데 deinit 함수중에는 sc 자체를 free 까지 해주는 함수가
// 안보이네 일단 샘플이니 여기서 그냥 free 를 했지만 정말 써먹을
// 상황이 온다면 dll 간에 malloc/free 가 섞일수도 주의하자.
scheme_deinit(sc);
free(sc);
}



// scheme 에 노출할 함수는 pointer foo(scheme*, pointer) 형태의
// 시그너쳐를 가지고 pointer 를 통해서 인자들이 리스트 형태로
// 들어온다. 복잡한데 쓸거 아니니 이정도만 알면 안심
pointer c_add(scheme* sc, pointer args)
{
// 첫번째 인자가 존재하고 정수가 맞는지 확인
if(args == sc->NIL) return sc->NIL;
pointer a = pair_car(args);
if(!is_integer(a)) return sc->NIL;

// 이거.. 변수 따로 잡기 귀찮아서 그냥 덮어썼는데
// 그래서 arg list 들의 첫번째 car 를 팝 한 효과가 났다.
args = pair_cdr(args);

// 다음 인자가 존재하고 정수가 맞는지 확인 꼴을 보니 좀 머리 쓰면
// 이쁘게 짤수 있을거 같은데 오늘은 샘플이니 그냥..
if(args == sc->NIL) return sc->NIL;
pointer b = pair_car(args);
if(!is_integer(b)) return sc->NIL;

// 더한값을 scheme 자료형태로 리턴
return mk_integer(sc, ivalue(a) + ivalue(b));
}