TCL

2012-07-18 13 views
6

'de uplevel komutu anlaşılamıyor TCL'de yükseltme düzeyini anlama konusunda bazı sorunlar yaşıyorum. Brent Welch'in TCL ve Tk'deki pratik programcılığını okuyorum ve anlayamadığım bir örnek var. İşte bu:TCL

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] 
} 

Birisi bana açıklayabilir mi? Kitabın açıklamasında bana yeterince yardımcı olmadı :(

cevap

6

uplevel komutu, geçerli prosedürden başka bir alanda bir komut (veya aslında bir komut dosyası) yürütür.Özellikle, bu durumda uplevel 1 demektir . (Ayrıca uplevel #0 ile küresel kapsamda yürütmek ya da böyle uplevel 2 ile arayanın arayan gibi diğer yerlerde olabilir ama bu gerçekten nadirbu.) “arayan yürütmek”

o satırın kalanını açıklanması: list'un kullanımı burada, dört kelimeden oluşan bir ikame gerektirmeyen komutun bir yolu olarak, foreach, içeriğinin args değişken, valueList değişkeninin içeriği ve break (aslında parantez içinde olmaları gerekmez). Bu, args'da listelenen her değişkene valueList önünden bir değer atar ve sonra durur ve arayan bağlamında bunu yapar.

Genel olarak, yordam, kapsamları ve bu gibi şeyler arasında geçiş yapmanın karmaşıklığı nedeniyle daha yavaş olmadıkça, bu işlem, yerleşik bir lassign (örneğin, boş olmayan bir giriş listesi ve değişken listesi varsayarak) gibi çalışır. Burada

+1

8.6'da, koordinler içeren 'uplevel # 1' için bir kullanım bulmayı başardık. Bu on yıl boyunca yasal olmasına rağmen, bu özel form için ilk pratik kullanım _ever_ olarak kabul edildi. –

+0

* # * sözdizimi şu şekilde açıklanmıştır: "Eğer * seviyesi * bir sayı ve ardından bir sayı içeriyorsa, bu sayı mutlak bir seviye numarası verir." http://www.tcl.tk/man/tcl8.5/TclCmd/uplevel.htm –

+0

@DonalFellows En üstteki 'coroutine' yığınının altını çizmeyin. –

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" 

en içindeki yöntem O zaman ı değiştirebilir seviye değerini değiştirmek bu yüzden Proc a'da 3. seviye olacak düzeyde 2 ve ana program c, seviye seviye 0 ve b olacak Herhangi bir proc değişkeninin x değeri, a, b, c veya ana proc olan "a" yönteminin kendisidir. Seviyeyi 3,2,1,0 olarak değiştirmeyi deneyin ve sihirli putput'a bakın.

İlgili konular