Обратите внимание, это продолжение моего вопроса здесь .
Я пытаюсь разобрать следующий код 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
она существует (по крайней мере, кажется).Что здесь происходит?
Обратите внимание, я знаю приоритет скобок в ruby и понимаю, что это работает:
foo (bar) {
biz buzz
}
Однако я хочу опустить скобки.Так возможно ли это в рубине (без лексического анализа)?