16

リストをTclプロシージャに渡す標準的な方法は何ですか?

リストが可変数の引数に自動的に展開されるように取得できれば、本当に気に入っています。

そのため、次のようになります。

set a {b c}
myprocedure option1 option2 $a

myprocedure option1 option2 b c

同等です。

これは前に見たことがあると思いますが、オンラインのどこにも見つかりません。両方のケースを同等にするためのヘルプ(およびコード)をいただければ幸いです。

これは標準の Tcl 規則と見なされますか。それとも、私は間違った木を吠えていますか?

4

3 に答える 3

22

使用している Tcl のバージョンによって異なりますが、8.5 の場合:

set mylist {a b c}
myprocedure option1 option2 {*}$mylist

8.4 以下の場合:

set mylist {a b c}
eval myprocedure option1 option2 $mylist
# or, if option1 and 2 are variables
eval myprocedure [list $option1] [list $option2] $mylist
# or, as Bryan prefers
eval myprocedure \$option1 \$option2 $mylist
于 2009-10-20T19:35:49.750 に答える
0

コマンドをcatchに渡すと、この問題も解決されることに注意してください。

set a {b c}
if [catch "myprocedure option1 option2 $a"] {
    # handle errors
}

これはおそらく、コードのこの時点で myprocedure でエラーを処理したい場合にのみ使用して、キャッチされたエラーを再スローすることを心配する必要がないようにする必要があります。

于 2015-05-15T02:04:29.963 に答える
0

RHSeeger の回答を拡張するには、次のargsような特別な引数を使用して myprocedure をコーディングします。

proc myprocedure {opt1 opt2 args} {
    puts "opt1=$opt1"
    puts "opt2=$opt2"
    puts "args=[list $args]" ;# just use [list] for output formatting
    puts "args has [llength $args] elements"
}
于 2009-10-21T00:31:23.477 に答える