ブロックの解釈の仕方をカスタマイズする
DSLみたいなものを作ろうとしてると、どうしてもブロックを俺俺文法で解釈させたくなって調べてみた。
ParseTreeというライブラリを使うとRubyのコードをS式に変換することが出来る。
S式に変換できるのは、モジュール単位、モジュールのメソッド単位、文字列を渡すの3種類の方法があり、
自分はブロックの部分のみをいじりたかったので次のようにしてみた
require 'rubygems' require 'parse_tree' class Hoge def fuga &block mod = Module.new mod.module_eval do mod.define_method :block, &block end s_exp = ParseTree.translate(mod, :block) HogeProcesssor.new(s_exp) end end
無名モジュールを作ってやってメソッド名を決めうちで定義してやってParseTreeに渡している。Ambitionのコードを見てみると違うやり方をしていたっぽいのだけどよくわからなかったw
HogeProcessorはSexpProcessorを継承したクラスでS式はこのクラスでいじくり回して欲しい形に変換する。
parse_〜というメソッドを定義しておけば自動的に実行されることはわかったのだけど、それ以外はよくわからなかった。
とりあえず頑張ってやってみてもParseTreeを使ってる時点で1.9に対応できなくなってしまうので、いいやと思ってHashとArrayの組み合わせで頑張ることにしたのでした。
非常に中途半端なのですが、また使いたくなった際に忘れてそうなのでメモです