defmacroの検討その2

よく考えるとマクロの引数は評価しちゃいけなかったんだ。

  defmacro :foo {|x| "print \'foo -> #{x}\'"}

  foo(1 + 1)


print '2'ではなく、print '1+1'にしないといけなかった。これを実現するには、

  1. Rubyインタープリタから抽象構文木(AST)を得るような拡張ライブラリを作る
  2. Rubyのパーサーを作る
  3. バイトコードから逆コンパイルする

が方法としてあると思います。3の逆コンパイルが面白そうで、実は簡単な気がするのでこれをちょっと検討します。でも、ちょっと最適化を強化するとすぐ動かなくなりそうです。