mrubyのメモとか。
mrubyについていろいろ調べながらプログラムを書いてます。
その中で調べたことについて書いておきます。
主に、C言語からmrubyにメソッドを追加したり呼び出したりすることについてです。
http://avr.paslog.jp/article/2492088.html や http://akasata.hatenablog.com/entry/2012/05/30/202432 を参考にしています。
// メソッドを定義します。 // 二つ目の引数では定義する先のモジュールを指定するようですが、 // ここはKernelにしたので関数のように使えます。 // mrbはmrb_stateで、多くのの関数で引数になっています。 mrb_state *mrb = mrb_open(); // のようにして生成します。 mrb_define_method(mrb, mrb->kernel_module, "メソッド名", &中身の関数, 引数の数); // 中身の関数はこうなっています。 mrb_value hoge(mrb_state *s, mrb_value self) { mrb_int a, b; // この関数で渡された引数を取得できます。 // "ii"のところで、引数がどんな型なのかを指定するようです。 // "i"はintのことで、それを二つ並べるとintが2つになります。 // オブジェクトなら"o"を使います。 mrb_get_args(s, "ii", &a, &b); // これはnilを生成して返します。 return mrb_nil_value(); } // オブジェクト場合はこうです。(これはオブジェクトを2つ引数に取る場合) mrb_value a; mrb_value b; mrb_get_args(s, "oo", &a, &b); // オブジェクトのメソッドを呼び出すにはこうします。 // 今回は、引数の数が0の場合です。 // sはmrb_stateです。 result = mrb_fixnum(mrb_funcall(s, オブジェクト, "メソッド名", 引数の数)); // mrb_funcallでメソッドを呼び出しますが、その結果はRubyの値(mrb_value)なので、 // intが欲しい場合はmrb_fixnumを使ってintを取り出します。 // クラスをインスタンス化してオブジェクトを生成する方法です。 // オブジェクトを表す値が返ってきます。 // sはmrb_stateです。 // 二つ目の引数の2は引数の数、三つ目のarrは引数の配列で、Rubyの値を表すmrb_valueの配列です。 // mrb_valueの配列なのでintはそのまま入りません。 // なので、mrb_fixnum_valueでint型の値をmrb_valueに変換します。 // mrb_class_get(s, "クラス名")は、クラスを取得しています。 mrb_value arr[2]; arr[0] = mrb_fixnum_value(x); arr[1] = mrb_fixnum_value(y); mrb_class_new_instance(s, 2, arr, mrb_class_get(s, "クラス名"));
ちなみに、SDLとmrubyを組み合わせてゲームでも作れたらと思っていろいろやってます。