2012-04-11 8 views
2

私がしたいのは、評価なしで文字列としてtcl procの引数を解析することです。未評価のtcl引数の取得

test [list [expr 1+1] [expr 2+2]] 

としていないTCL [list [expr 1+1] [expr 2+2]]を評価:

proc test { args } { 
    puts "the args are $args" 
} 

は、私は何をしたいことと、それを呼び出すです:たとえば は、私はちょうどそれの引数を出力些細なprocのを持っていた場合。または、それが と評価されたとしても、私は元のコマンドラインを持っていたいと思います。このように些細な「テスト」とI上記 procが返すことができるようにしたい:

the args are [list [expr 1+1] [expr 2+2]]

は、Tcl 8.4で、このことは可能ですか?

答えて

3

あなたはTclの8.4(とし、前にこれを行うことはできません);言語の設計はこれを不可能にします。この修正は、評価されていない(中括弧で囲まれた)引数を渡すことです。あなたは好きなように印刷することができます。評価されたフォームを取得するには、プロシージャ内でこれを行う必要があります。

set evaluated_x [uplevel 1 [list subst $unevaluated_x]] 

これはちょっと面倒です。


あなたはTclの8.5を使用していた場合、あなたは別の選択肢を持っていると思います:

set calling_code [dict get [info frame -1] cmd] 
info frame -1は、現在のプロシージャを呼び出したコンテキストで、現在のコマンドの説明を保持する辞書を取得し

、およびそのcmdキーは、置換ルールが適用される前の実際のコマンド文字列です。それはあなたが望むものでなければなりません(しかし、それはコマンド名自体を含んでいることに注意してください)。

これは8.4で利用できません。またでもにバックポートすることもできません。あなたはアップグレードしたいかもしれません!

+0

ありがとうございます。これは私が恐れていたものです。 – user1327792

+0

私は 'info frame'が8.4にバックポートされることはないと確信している理由は、実装するのにかなり多くの侵入機械が必要だったからです。すでに非常に複雑な分野でのTclの実装には、多くの複雑さが加わりました。バックポートは非​​常に破壊的です。 –

1

例えば、テスト、enclose them in bracesに引数を渡す: テスト{[リスト[式expr 1 + 1] [exprの2 + 2]]}

+0

ありがとうございました。しかし、私は引数リストが私に渡されたと言及することを忘れて、私は中括弧を追加するargを編集することはできません。 – user1327792

関連する問題