1

引数が文字列で囲まれていないTclコードを解析できるようにしたいと思います。

このtclコードを検討してください。

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

foo bar

Tclに慣れていない場合fooは、はメソッド名でbarあり、は引数です(Tclでは引用符はオプションです)。

前のコードは次のように出力します。

Foo --> bar

rubyを使用してまったく同じ入力を解析することは可能ですか(bar引用符で囲まれていないままです)?

同等のルビーコードは次のとおりです。

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 に答える