2009-10-20 12 views
11

को पास करने की सूची टीसीएल प्रक्रिया में एक सूची पास करने का कैननिक तरीका क्या है?टीसीएल प्रक्रिया

अगर मैं इसे प्राप्त कर सकता हूं तो मुझे वास्तव में यह पसंद आएगा ताकि एक सूची स्वचालित रूप से तर्कों की एक चर संख्या में विस्तारित हो।

तो तरह है कि कुछ:

set a {b c} 
myprocedure option1 option2 $a 

और

myprocedure option1 option2 b c 

बराबर हैं।

मुझे यकीन है कि मैंने इसे पहले देखा था, लेकिन मुझे इसे कहीं भी ऑनलाइन नहीं मिल रहा है। दोनों मामलों के बराबर बनाने के लिए कोई मदद (और कोड) की सराहना की जाएगी।

क्या यह एक मानक टीसीएल सम्मेलन माना जाता है। या मैं भी गलत पेड़ को भड़क रहा हूँ?

+0

Ca आप अपने महान प्रश्न में कहीं भी "अनैप" शब्द ("अनचाहे तर्क" में सबसे अच्छा) जोड़ते हैं? मुझे इसे खोजने में कठिन समय था :-) – cfi

उत्तर

14

यह आप का उपयोग कर रहे Tcl के संस्करण पर निर्भर करता है, लेकिन: 8.5 के लिए:

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

8,4 और नीचे के लिए:

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

... हालांकि मुझे व्यक्तिगत रूप से \ $ option1 \ $ विकल्प 2 [सूची $ विकल्प 1] [सूची $ optio2] के लिए अधिक बेहतर लगता है। यह इरादे से अधिक बारीकी से दिखाता है - आपका इरादा एक-तत्व सूचियां नहीं बनाना है, आपका इरादा उन चर के लिए प्रतिस्थापन के अतिरिक्त दौर को रोकने (या इसके खिलाफ) रोकने के लिए है। –

+0

8.4 और उससे नीचे के लिए ऐसा करने का वैचारिक तरीका यह है: 'eval [linsert $ mylist 0 myprocedure विकल्प 1 विकल्प 2]' –

+2

मैं इस बात से सहमत नहीं हूं कि यह कैननिकल है (लेकिन शायद हमारे पास अलग-अलग कैन हैं?)। यह तर्कसंगत रूप से सुरक्षित है लेकिन यह \ $ विकल्प 1 \ $ विकल्प 2 से कम पठनीय है और फिर कुछ हद तक अस्पष्ट करता है जो आप वास्तव में पूरा करने की कोशिश कर रहे हैं। –

0

RHSeeger के जवाब पर विस्तार के लिए, आपको कोड होगा विशेष args के साथ myprocedure इस तरह तर्क:

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 को कोड करना चाहते हैं। चाहे आप ऐसा करते हैं, इस पर निर्भर करता है कि इनपुट की एक परिवर्तनीय संख्या लेने के लिए आपको इसकी आवश्यकता है या नहीं, इस पर एक विशेष कॉलर के पास इसके इनपुट उपलब्ध होने पर नहीं होता है। – RHSeeger

0

यह ध्यान रखें कि catch करने के लिए अपने आदेश पारित करने को भी इस समस्या का समाधान होगा उपयोगी हो सकता है:

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

यह शायद ही आप ताकि आप डॉन 'अपने कोड में इस बिंदु पर myprocedure में त्रुटियों को संभालने के लिए चाहते हैं, तो इस्तेमाल किया जाना चाहिए पकड़े गए किसी भी त्रुटि को पुनर्स्थापित करने के बारे में चिंता करने की ज़रूरत नहीं है।

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