2012-07-18 14 views
6

में अपलेवल कमांड को समझ नहीं सकता है मुझे टीसीएल में अपलेवल के उपयोग को समझने में कुछ समस्याएं आ रही हैं। मैं टीसीएल और ब्रेंट में ब्रेंट वेल्च के प्रैक्टिकल प्रोग्रामिंग पढ़ रहा हूं और अपील में एक उदाहरण है जिसे मैं समझ नहीं पा रहा हूं। यहां यह है:टीसीएल

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 का उपयोग यहां एक प्रतिस्थापन मुक्त आदेश बनाने का एक तरीका है, जिसमें चार शब्द, foreach शामिल हैं, की सामग्री args चर, valueList चर की सामग्री, और break (जो वास्तव में ब्रेसिज़ में होने की आवश्यकता नहीं थी)। यह args में सूचीबद्ध प्रत्येक चर के लिए valueList के सामने से एक मान असाइन करेगा, और फिर रोकें, और यह कॉलर के संदर्भ में ऐसा करेगा।

कुल मिलाकर, यह प्रक्रिया 8.5 में अंतर्निहित lassign (एक गैर-खाली इनपुट सूची और परिवर्तनीय सूची मानते हुए) की तरह काम करती है, स्कोप और उसके जैसी चीजों के बीच स्वैपिंग की जटिलता के कारण धीमे को छोड़कर।

+1

8.6 में, हम कोरआउट के साथ 'अपलेवल # 1' के लिए उपयोग ढूंढने में कामयाब रहे। इसे उस विशेष रूप के लिए पहला व्यावहारिक उपयोग _ever_ माना जाता था, भले ही यह दशकों से कानूनी रहा हो। –

+0

* # * वाक्यविन्यास इस प्रकार वर्णित है: "यदि * स्तर * में # के बाद संख्या होती है तो संख्या पूर्ण स्तर संख्या प्रदान करती है।" http://www.tcl.tk/man/tcl8.5/TclCmd/uplevel.htm –

+0

@DonalFellows शीर्ष 'coroutine' स्टैक '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" 
यहाँ

सबसे अंदर विधि एक, स्तर में स्तर 0 और ख में हो जाएगा ग स्तर 2 में और मुख्य कार्यक्रम proc एक में तो 3 स्तर में हो जाएगा अगर मैं स्तर का मूल्य बदल तो मैं बदल सकते हैं किसी भी proc के परिवर्तनीय एक्स का मान ए, बी, सी या मुख्य proc विधि "ए" से हो सकता है। स्तर को 3,2,1,0 तक बदलने का प्रयास करें और जादू पुटपुट देखें।

संबंधित मुद्दे