2

私がやりたいことは、tcl proc への引数を評価せずに文字列として解析することです。たとえば、引数を出力するだけの簡単な proc があるとします。

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

私がやりたいのは、次のように呼び出すことです:

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

そして、tcl に を評価させないで[list [expr 1+1] [expr 2+2]]ください。または、評価されたとしても、元のコマンドラインが必要です。したがって、上記の簡単な「テスト」プロシージャを使用して、次を返すことができるようにしたいと思います。

引数は [list [expr 1+1] [expr 2+2]] です。

これはtcl 8.4で可能ですか?

4

2 に答える 2

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 では利用できず、バックポートされることもありません。アップグレードしたくなるかもしれません!

于 2012-04-11T23:45:40.460 に答える
1

引数を test に渡すときは、中かっこで囲みます。例: test {[list [expr 1+1] [expr 2+2]]}

于 2012-04-11T23:30:07.583 に答える