サーチ…
備考
引数を受け入れないプロシージャ
proc myproc {} {
puts "hi"
}
myproc
# => hi
空の引数リスト(プロシージャ名の後の2番目の引数、 "myproc")は、プロシージャが引数を受け入れないことを意味します。
2つの引数を受け入れるプロシージャ
proc myproc {alpha beta} {
...
set foo $alpha
set beta $bar ;# note: possibly useless invocation
}
myproc 12 34 ;# alpha will be 12, beta will be 34
引数リストが単語で構成されている場合、それらはプロシージャ内のローカル変数の名前になり、その初期値はコマンドライン上の引数値と等しくなります。引数は値によって渡され、プロシージャ内の変数値に何が起こったとしても、プロシージャ外のデータの状態には影響しません。
可変数の引数を受け入れるプロシージャ
### Definition
proc myproc {alpha {beta {}} {gamma green}} {
puts [list $alpha $beta $gamma]
}
### Use
myproc A
# => A {} green
myproc A B
# => A B green
myproc A B C
# => A B C
このプロシージャは、1つ、2つ、または3つの引数を受け取ります。名前が2つのアイテムのリストの最初の項目であるパラメータはオプションです。パラメータ変数( alpha 、 beta 、 gamma )は、左から右に割り当てられた、利用可能な数の引数値を取得します。代わりに引数の値を取得しないパラメータ変数は、その一部であったリストの2番目の項目から値を取得します。
オプションの引数は、引数リストの最後に来なければならないことに注意してください。引数N-1がオプションの場合、引数Nもオプションでなければなりません。プロシージャを呼び出している間、ユーザは、引数Nはなく、引数N-1、N-1は、明示的に引数Nの前に言及する必要があり、引数のデフォルト値を持っている場合、であれば。
myproc A B C D
# (ERROR) wrong # args: should be "myproc alpha ?beta? ?gamma?"
このプロシージャでは、引数構文を説明する有用なエラー・メッセージが自動的に作成されることに注意してください。
任意の数の引数を受け入れるプロシージャ
proc myproc args { ... }
proc myproc {args} { ... } ;# equivalent
特別なパラメータ名argsが引数リストの最後の項目である場合、コマンドラインのその時点ですべての引数のリストを受け取ります。何もない場合、リストは空です。
args前には、オプションのものも含めて引数があります。
proc myproc {alpha {beta {}} args} { ... }
このプロシージャは、1つ以上の引数を受け入れます。最初の2つがあれば、 alphaとbetaによって消費されます:残りの引数のリストはargsに割り当てられます。
変数への名前/参照を受け入れるプロシージャ
proc myproc {varName alpha beta} {
upvar 1 $varName var
set var [expr {$var * $alpha + $beta}]
}
set foo 1
myproc foo 10 5
puts $foo
# => 15
この特定の場合、プロシージャには現在のスコープ内の変数の名前が与えられます。 Tclプロシージャー内では、そのような変数は自動的には表示されませんが、 upvarコマンドは別のスタック・レベルの変数の別名を作成できますupvarは呼び出し側のスタック・レベル、#0はグローバル・レベルなどを意味します。スタックレベル1と名前foo (パラメータ変数からvarName )することができますupvarその変数を見つけると呼ばれるエイリアス作成var 。 varすべての読み取りまたは書き込み操作は、呼び出し元のスタックレベルでfooにも発生します。
{*}構文
あなたが持っているものはリストですが、リスト内のアイテムを個別の引数として各アイテムを取得する要求に渡すコマンドです。たとえば、 winfo childrenコマンドはウィンドウのリストを返しますが、 destroyコマンドは一連のウィンドウ名引数のみを取ります。
set alpha [winfo children .]
# => .a .b .c
destroy $alpha
# (no response, no windows are destroyed)
解決策は、 {*}構文を使用することです。
destroy {*}[winfo children .]
または
destroy {*}$alpha
{*}構文がしていることは、以下の値(間に空白を入れない!)をとり、その値の項目を個々の引数のようにコマンドラインにスプライスすることです。
次の値が空のリストの場合、何もスプライスされません。
puts [list a b {*}{} c d]
# => a b c d
1つ以上のアイテムがある場合、それらは挿入されます:
puts [list a b {*}{1 2 3} c d]
# => a b 1 2 3 c d