2009-10-20 17 views
11

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

リストが自動的に可変数の引数に展開されるようにすれば本当に好きです。

のようなものようにするには:

set a {b c} 
myprocedure option1 option2 $a 

myprocedure option1 option2 b c 

は等価です。

私はこれを前に見たことがありますが、どこでもオンラインで見つけることはできません。両方のケースを同等にするためのヘルプ(およびコード)は高く評価されます。

これは標準的なTcl規則と見なされますか?それとも、私は間違った木を吠えることさえありますか?

+0

Caあなたの偉大な質問のどこかに「unwrap」という言葉を付け加えてください。私はそれを見つけるのが苦労しました:-) – cfi

答えて

14

それはあなたが使用しているのTclのバージョンに依存しますが、8.5の場合 :8.4以下の場合

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

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 
+1

...私は個人的には、[list $ option1] [list $ optio2]よりも\ $ option1 \ $ option2がより好ましいと感じます。それは意図をより詳細に示しています.1つの要素のリストを作成するのではなく、それらの変数の余分な置換を防止することです。 –

+0

8.4以下でこれを行う標準的な方法は次のとおりです: 'eval [linsert $ mylist 0 myprocedure options1 option2]' –

+2

私はそれが正準であるとは思っていません。間違いなく最も安全ですが、\ $ option1 \ $ option2より読みにくく、実際に達成しようとしていることがやや隠れています。 –

0

RHSeegerの答えに展開するには、あなたがコーディングしこのような特殊なargs引数を持つ手続き:

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" 
} 
+0

私は、あなたが必然的に可変数の引数をとるようにmyprocedureをコードすることに同意しない(つまり、 "args"を使う)。あなたがそうするかどうかは、特定の発信者がどのように入力を利用できるかにではなく、さまざまな入力をする必要があるかどうかによってまったく異なります。 – RHSeeger

0

catchにあなたのコマンドを渡すことも、この問題を解決することに注意すると便利かもしれません:あなたはドンように、あなたのコードでは、この時点でmyprocedureでエラーを処理する場合

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

これはおそらく唯一の」を使用する必要があります捕らえられたエラーを取り除くことを心配しなければならない。

関連する問題