使用Ruby解析Tcl DSL

| 我希望能够解析一些参数不被字符串包围的Tcl代码。 考虑以下tcl代码:
proc foo {name} {
  puts \"Foo --> $name\"
}    

foo bar
对于不熟悉Tcl的用户,
foo
是方法名称,and2ѭ是自变量(Tcl中的引号是可选的)。 先前的代码将输出:
Foo --> bar
是否可以使用ruby解析完全相同的输入(
bar
保持未引用)? 等效的红宝石代码为:
def foo(name)
  puts \"Foo --> #{name}\"
end

tcl = <<-TCL.gsub(/^\\s+/, \"\").chop
  foo bar
TCL
instance_eval(tcl)
当然,当它达到
bar
时会失败,因为它会被引用。 我尝试过with7ѭ
def method_missing(meth, *args)
    puts meth.to_s + \" --> args.to_s
end
但它以相反的顺序解析:
to_hash --> []
bar --> []
foo --> [nil]
有没有人有针对此类问题的明确解决方案。我想避免标记字符串,因为与词法分析相比,通过调用方法读取数据所需的工作最少。但是,如果我试图做一些不可能的事情,我想知道。谢谢。     
已邀请:
它对您不起作用,因为
.puts
方法返回
nil
而不是字符串:
irb(main):003:0> puts \"42\"
42
=> nil
我真的不知道为什么ѭ13出现在此ѭ7中,但是它起作用:
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
    
这是一种尝试使语法接近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
    

要回复问题请先登录注册