2010-07-13 10 views
7

टीसीएल पर एक शुद्ध सैद्धांतिक प्रश्न।टीसीएल बेनामी कार्य

this question मैं सोच रहा था कि टीसीएल में अज्ञात कार्यों को लागू करने का सबसे अच्छा तरीका क्या होगा।

अंतिम परिणाम anohter proc के लिए एक तर्क के रूप में एक पूर्ण proc पारित करने के लिए एक डेवलपर के लिए अनुमति देता है किया जाना चाहिए: अब

do_something $data {proc {} {input} { 
    puts $input; 
}}; 

जो जावास्क्रिप्ट के

do_something(data, function (input) { 
    alert(input); 
}); 

करने के समान होगा, स्वाभाविक रूप से इस नहीं होगा काम ओओटीबी। मैं इस तरह के कुछ पर सोच रहा था:

proc do_something {data anon_function} { 
    anon_run $anon_function $data 
} 
proc anon_run {proc args} { 
    set rand proc_[clock clicks]; 
    set script [lreplace $proc 1 1 $rand]; 
    uplevel 1 $script; 
    uplevel 1 [concat $rand $args]; 
    uplevel 1 rename $rand {}; //delete the created proc 
} 

यह काम करता है। लेकिन मैं उम्मीद कर रहा था कि इसके बाद बेहतर पैटर्न के लिए सुझाव प्राप्त करें, क्योंकि यह बहुत ही सुरुचिपूर्ण नहीं है और वास्तव में कूल टीसीएल सुविधाओं का उपयोग नहीं कर रहा है। अधिकतर मैं मैन्युअल रूप से anon_run पर कॉल करने से छुटकारा पाना चाहता हूं।

उत्तर

11

टीसीएल 8.5 में, आप apply कमांड का उपयोग कर सकते हैं। (! सिफारिश की)

proc do_something {data anon_function} { 
    apply $anon_function $data 
} 
do_something $data {{input} { 
    puts $input 
}} 
बेशक

, आप आदेश उपसर्ग के रूप में अपने कॉलबैक की संरचना कर रहे हैं तो आप ऐसा कर सकते हैं: यदि आप 8.4 या उससे पहले उपयोग कर रहे हैं

proc lambda {arguments body} { 
    # We'll do this properly and include the optional namespace 
    set ns [uplevel 1 namespace current] 
    return [list ::apply [list $arguments $body $ns]] 
} 

proc do_something {data command} { 
    {*}$command $data 
} 

do_something $data [lambda {input} { 
    puts $input 
}] 

, आप code from the Tcler's Wiki की जरूरत एक विकल्प के रूप में, लेकिन ध्यान रखें कि वे समाधान केवल अर्थात् समकक्ष (सर्वोत्तम रूप से) हैं; वे प्रदर्शन-समकक्ष नहीं हैं।

+0

यह भी ध्यान दें, जावास्क्रिप्ट के विपरीत यह बंद नहीं करता है। क्लोजर टीसीएल में सैद्धांतिक रूप से मुश्किल हैं क्योंकि वे वास्तव में टीसीएल के डाटाटाइप मॉडल के साथ फिट नहीं होते हैं, और ऊपर के रूप में लैम्ब्डा शब्द इस समस्या को विशेष रूप से स्पष्ट करते हैं (यह प्रक्रियाओं के साथ एक बड़ी समस्या नहीं है, केवल प्रोग्रामिंग का एक सरल मामला है)। –

+0

मैं विस्तृत और अच्छी तरह से समझाया गया उत्तर की सराहना करता हूं। –

+0

और मैंने वास्तव में मेरी परियोजनाओं में से एक के लिए एक [सीमित रूपों का सीमित] हैक किया है (https://chiselapp.com/user/kbk/repository/tclquadcode/artifact/9cd98bc023dd3ef1?ln=353,382)। –

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