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

댓글 없음: