2012-07-18 13 views
6

TCLでアップレベルの使用を理解する上で問題があります。私はBrent WelchのTCLとTkのPracticalプログラミングを読んでいます。私は理解できないほど上の例があります。ここにあります:TCLでuplevelコマンドを理解できません

proc lassign {valueList args} { 
    if {[llength $args] == 0} { 
    error "wrong # args:lassign list varname ?varname...?" 
    } 
    if {[llength $valueList] == 0} { 
    #Ensure one trip through the foreach loop 
    set valueList [List {}] 
    } 
    uplevel 1 [list foreach $args $valueList {break}] 
    return [lrange $valueList [llength $args] end] 
} 

私にそれを説明してもらえますか? (

答えて

6

uplevelコマンドは、現在のプロシージャとは別のスコープでコマンド(実際にはスクリプト)を実行します。具体的には、uplevel 1を意味します。 。(あなたはまた、uplevel #0でグローバルスコープで実行、またはあまりにもそのようuplevel 2の呼び出し元の呼び出し側と他の場所ですることができますが、それは本当に珍しいだ。)「呼び出し側で実行」

をその行の残りの部分を説明します:ここでlistを使用するのは、置換え不要のコマンドを作成する方法です。このコマンドは、4つの単語、foreachargs変数、valueList変数の内容、およびbreak(実際には中括弧内にある必要はありません)。それはvalueListの前の値をargsにリストされている各変数に割り当ててから停止し、呼び出し元のコンテキストで実行します。

全体的に、この手順は、スコープとそのようなものとの間のスワッピングの複雑さのために、8.5のビルトインlassign(入力リストと変数リストが空でないと仮定した場合)と同じように機能します。ここで

+1

8.6では、コルーチンを使って 'uplevel#1'を使うことができました。これは数十年にわたり合法的であったとしても、その特定の形態のための最初の実用的な使用であると考えられました。 –

+0

* * *の構文が記述されています。「*レベル*が#で構成され、その後に番号がある場合、番号は絶対レベル番号を与えます。 http://www.tcl.tk/man/tcl8.5/TclCmd/uplevel.htm –

+0

@DonalFellowsトップ 'コルーチン 'スタックを' tailcall'しないでください。 –

3
proc a {} { 
    set x a 
    uplevel 3 {set x Hi} 
    puts "x in a = $x" 
} 
proc b {} { 
    set x b 
    a 
    puts "x in b = $x" 
} 
proc c {} { 
    set x c 
    b 
    puts "x in c = $x" 
} 
set x main 
c 
puts "x in main == $x" 

最も内側の方法私は、私は変更することができるレベルの値を変更した場合ので、PROC aでレベル3になり、レベル2におけるメインプログラムCのレベルにレベル0およびbになります任意のprocの変数xの値は、メソッド "a"自身のa、b、cまたはmain procである。 レベルを3,2,1,0に変更し、魔法のputputを見てください。

関連する問題