cremno さんが mruby-dll という、mruby.dll を作るバッチファイルその他を作ってくれたので試した。
cremno/mruby-dll - GitHubmruby.dll の作り方はプロジェクトの README.md を見ていただくとして、これを使ったアプリケーションを書いてみた。
a quick-and-dirty script that creates mruby.dll
https://github.com/cremno/mruby-dll
#include <windows.h>
#include <stdio.h>
#define _(x) #x
typedef struct mrb_value {
char _[16];
} mrb_value;
int
main(int argc, char* argv[]) {
HMODULE hmruby = LoadLibrary("mruby.dll");
void* (*mrb_open)();
void (*mrb_close)(void*);
mrb_value (*mrb_load_string)(void*,const char*);
void* mrb;
void* ctx;
mrb_open = (void* (*)()) GetProcAddress(hmruby, "mrb_open");
mrb_close = (void (*)(void*)) GetProcAddress(hmruby, "mrb_close");
mrb_load_string = (mrb_value (*)(void*,const char*)) GetProcAddress(hmruby, "mrb_load_string");
mrb = mrb_open();
mrb_load_string(mrb, _(
\n
def fizz_buzz_factory \n
i = 0 \n
Proc.new do \n
i += 1 \n
case \n
when i % 15 == 0 then "FizzBuzz" \n
when i % 5 == 0 then "Buzz" \n
when i % 3 == 0 then "Fizz" \n
else i \n
end \n
end \n
end \n
\n
fb = fizz_buzz_factory \n
\n
(1..100).to_a.each do \n
puts fb.call \n
end \n
));
mrb_close(mrb);
FreeLibrary(hmruby);
return 0;
}
単純に DLL をロードしてコールする物。mruby.h を使わずやりたかったので mrb_value を固定 16 バイトに。実行するとちゃんと FizzBuzz 出力されます。
mrb_load_string の戻り値が構造体の実体なので、この DLL だけを使うにはおそらく FFI が書ける使える LL くらいしか無いと思いますが、遊ぶには十分だと思います。
いい大人なので、ちゃんと発音しましょう。