1

我希望能够解析一些参数没有被字符串包围的 Tcl 代码。

考虑这个 tcl 代码:

proc foo {name} {
  puts "Foo --> $name"
}    

foo bar

对于那些不熟悉 Tcl 的人,foo是方法名和bar参数(引号在 Tcl 中是可选的)。

前面的代码将输出:

Foo --> bar

是否可以使用 ruby​​ 解析完全相同bar的输入(未引用)?

等效的 ruby​​ 代码是:

def foo(name)
  puts "Foo --> #{name}"
end

tcl = <<-TCL.gsub(/^\s+/, "").chop
  foo bar
TCL
instance_eval(tcl)

当然,当它到达时会失败,bar因为它预计会被引用。

我试过修补method_missing

def method_missing(meth, *args)
    puts meth.to_s + " --> args.to_s
end

但它以相反的顺序解析:

to_hash --> []
bar --> []
foo --> [nil]

有没有人对这类问题有一个干净的解决方案。我想避免对字符串进行标记,因为与词法分析相比,通过调用方法读取数据需要最少的工作。但如果我想做一些不可能的事情,我想知道。谢谢。

4

2 回答 2

1

它对您不起作用,因为.puts方法返回nil而不是字符串:

irb(main):003:0> puts "42"
42
=> nil

我真的不知道为什么会to_hash出现在这个method_missing但它有效:

def foo(name)
  puts "Foo --> #{name}"
end

def method_missing(meth, *args)
     meth.to_s unless meth.to_s  == "to_hash"
end

tcl = <<-TCL.gsub(/^\s+/, "").chop
  foo bar
TCL

instance_eval(tcl)

=> Foo --> bar
于 2011-04-20T21:15:13.127 回答
1

这是一个尝试使语法接近 TCL 语法的实现。

class TCL
  class << self
    alias run instance_eval
    def proc(n, &b)
      self.class.__send__(:define_method, n, &b)
    end
    def method_missing(n, *a, &b)
      n.to_s
    end
  end
end

TCL.run do

  proc(:foo) { |name|
    puts "Foo --> #{name}"
  }

  foo bar

end

# prints Foo --> bar
于 2011-04-20T21:22:21.847 回答