またAPIとか整理されてないので、コンパイルにはソースディレクトリを参照に含めたりする必要がある。
#include <mruby.h>
#include <mruby/proc.h>
#include <compile.h>
int
main() {
int n;
mrb_state* mrb;
struct mrb_parser_state* st;
char* code =
"[1,2,3].each {|x| " \
" p x " \
"} ";
mrb = mrb_open();
st = mrb_parse_string(mrb, code);
n = mrb_generate_code(mrb, st->tree);
mrb_pool_close(st->pool);
mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_nil_value());
}
/* vim:set et ts=2 sts=2 sw=2 tw=0: */
mrb_open()
で状態遷移マシンを作り、文字列をパースして構文木を作る(mrb_parse_string()
)。yaccによるAST。その構文木からジャンプ命令等の実行コードを吐いて(mrb_generate_code()
)実行する(mrb_run()
)。まぁ一般的な奴ですね。これからいろいろ出来る様になるんだろうけど、Lightweight を歌ってるのでどの辺が線引きなのか難しそう。
MinGW32 だと以下の様にしてビルド出来た。
gcc -Iinclude -Isrc foo.c lib/ritevm.lib