リフレクティブなマクロの実験
yarv2llvmのマクロは、定義の中でyarv2llvmのメソッドが呼べます。これを利用するとオブジェクトの型や、スタックフレームなどメタなものに対して色々な操作ができます。まだ、APIを整備していないのでyarv2llvmの処理系の一部みたいなコードを書かないといけないのですが、将来はもっときれいに書けるようにしたいです。
ためしに、Common Lispのthe特殊形式みたいなものを作ってみました。the特殊形式は式の型を宣言するためのもので、
(the fixnum (+ 5 7))
みたいに使います。yarv2llvm版はこんな感じです。
the(:Fixnum, 5 + 7)
yarv2llvmは型推論があるからこんなもの必要ないんじゃないかと思う人もいるかもしれませんが(いないほうが可能性が高そう)、ライブラリとかで定義しても使わないので型が決まらないとか、型に関するエラーチェックがしたいとかで明示的に型宣言がしたい場合もあるかなと思います。
別にシステムでは用意せずに必要があればユーザが定義すればいいというのがミソです。今の状態ではシステム拡張するのと手間がほとんど同じなんですが・・・。
theの定義はこんな感じです。
YARV2LLVM::define_macro :the do |arg| type = RubyType.from_sym(arg[1][0].type.constant, 0, "Type defined by the macro") exp = arg[0] type.add_same_type exp[0] `#{exp}` end
おまけ
the特殊形式の説明をGoogleで探そうとしたのですが、挫折しました。すごく探しにくいです。