Meadowとclingくっつけた
https://skydrive.live.com/redir?resid=ECB59E566C2D71F1!107
中の bin,include,lib を meadow のディレクトリにコピーしてください。
(http://d.hatena.ne.jp/w_o/20110528#1306563712 も入れてます。)
(cling-eval "printf(\"hello\\n\");")
こういのができたらいいと思ってて、ずっと自分でCコンパイラ書こうと思ってたが、結局何もやってないので、clangに頼った。
cling は、clangを使ったインタプリタ。
http://root.cern.ch/drupal/content/cling
結構中身出ちゃってるclangのインターフェースと違って、もうちょっと理解しやすいインターフェースになってると思うので、インタプリタ的なことをやりたい場合はこっちのインターフェース使うのもよいと思った。
ただDiagnostics出力がstderr固定なのでコンパイルエラーを取得する方法がない。
Meadow側のコードは、
https://github.com/tanakamura/meadow/blob/master/src/clang.cpp
このへん。あと、C++がリンクできるようにいくらかmakefileを変えてる。
よっつ関数が定義されてて、
- cling-eval : 引数文字列をclingで評価
- clang-eval : 引数文字列をC++文字列として評価
- cling-eval-region : 引数範囲をclingで評価
- clang-eval-region : 引数範囲をC++文字列として評価
clingで評価すると、トップレベルで処理が書けるようになっているけど、そのかわり関数定義ができない。
clang は多分JITで生成したコードの例外がMSVCでビルドした場合サポートされてないみたいで、undefined symbol とか出て止まる場合がよくある。
もちろん、この場合Meadowごと全て死ぬので、使う時は覚悟して使ってください。
(というか基本的に死ぬときはエディタもろとも死ぬ)
あと、MeadowのLispは、ポインタの上位3bitをタグとして使うみたいで、LLVM側が確保したメモリをLisp側に渡すと死ぬので、Lisp用の関数書くときは、
void regist() { Lisp_Subr *s = (Lisp_Subr*)xmalloc(sizeof(*s)); *s = Stest_hello; defsubr(s); }
↑ こんなふうにして、Lisp側のxmallocで確保したメモリを渡すようにしてください。