Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

mrubyで書いたコードをC言語内で読み出す方法

mrubyで書いたコードをC言語内で読み出す方法です。
今回はまんま参考もと様と同じ内容ですが……

mrubyコードをC言語に埋め込む

今回導入するコードは以下の通り

C言語のコード

ソース1。mrb_funcallで実行開始です。
3番目が呼び出す関数名、4番目が引数の数です。

/* sample.c */
#include "mruby.h"
#include "mruby/proc.h"
#include "mruby/compile.h"
#include "stdio.h"

int main ()
{
    mrb_state* mrb;
    int n;
    FILE* f;
    mrb_value ret;

    mrb = mrb_open();
    f = fopen("test.rb", "r");
    mrb_load_file(mrb, f);
    fclose(f);

    ret = mrb_funcall(mrb, mrb_top_self(mrb), "test", 1, mrb_fixnum_value(20) );
    printf("ret=%d\n", mrb_fixnum(ret));

    return 0;
}

mrubyスクリプト

ソース2。引数を二倍して返すのみ。

##test.rb
def test a
  return a * 2
end

試す

mrubyへのリンクを貼る

$ ln -s ~/path/to/mruby/ mruby

ソースコードの用意

$ cat > sample.c <<EOS
  #{例の如くソース1を入力}
> EOS
$ cat > test.rb <<EOS
  #{例の如くソース2を入力}
> EOS
$ ls -FG
test.rb  mruby@     sample.c

コンパイル&実行

$ gcc -I mruby/include/ -I mruby/src/ sample.c mruby/build/host/lib/libmruby.a -lm
$ ./a.out 
ret=40

まとめ

最も基本的な例について扱いました。
mruby内部ではClassやHashも使えるので、もっと複雑なロジックを書く事が出来ます。