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ごと全て死ぬので、使う時は覚悟して使ってください。
(というか基本的に死ぬときはエディタもろとも死ぬ)


あと、MeadowLispは、ポインタの上位3bitをタグとして使うみたいで、LLVM側が確保したメモリをLisp側に渡すと死ぬので、Lisp用の関数書くときは、

void regist()
{
    Lisp_Subr *s = (Lisp_Subr*)xmalloc(sizeof(*s));
    *s = Stest_hello;
    defsubr(s);
}

↑ こんなふうにして、Lisp側のxmallocで確保したメモリを渡すようにしてください。