読者です 読者をやめる 読者になる 読者になる

ブロックの解釈の仕方をカスタマイズする

ruby

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の組み合わせで頑張ることにしたのでした。

非常に中途半端なのですが、また使いたくなった際に忘れてそうなのでメモです