これは、ここでの私の質問のフォローアップであることに注意してください。
次のTclコードを解析しようとしています。
foo bar {
biz buzz
}
Tclでは、foo
はメソッド名、bar
は引数、残りはで処理される「ブロック」eval
です。
これが私の現在の実装です。
def self.foo(name, &block)
puts "Foo --> #{name}"
if block
puts "block exists"
else
puts "block does not exist"
end
end
def self.method_missing(meth, *args, &block)
p meth
p block
meth.to_s &block
end
tcl = <<-TCL.gsub(/^\s+/, "").chop
foo bar {
biz buzz
}
TCL
instance_eval(tcl)
これは以下を出力します:
:bar
#<Proc:0x9e39c80@(eval):1>
Foo --> bar
block does not exist
この例では、ブロックがfoo
メソッドに渡されるとき、それは存在しません。しかし、その中method_missing
には存在します(少なくとも存在しているように見えます)。何が起きてる?
注:私はルビーの括弧の優先順位を認識しており、これが機能することを認識しています。
foo (bar) {
biz buzz
}
ただし、かっこは省略したい。それで、これはルビーで(字句解析なしで)可能ですか?