2012-07-19 14 views
5

मैं एक दोस्त के साथ बंद होने पर चर्चा कर रहा हूं और वह सोचता है कि (partial + 5) एक बंद है। लेकिन मुझे लगता है एक बंद एक नि: शुल्क चर पर एक समारोह समापन, उदाहरण केक्या यह आंशिक कार्य एक बंद है?

(let [a 10] 
    (defn func1 [x] (+ x a)) 
) 

के लिए है तो func1 को बंद करने की है। लेकिन इस मामले में 5 एक नि: शुल्क चर नहीं है। तो सही जवाब कौन सा है?

+0

जबकि स्वीकृत उत्तर कार्यान्वयन के मामले में सही है, तो मैं तर्क दूंगा कि इसे बंद नहीं माना जाना चाहिए, बल्कि "केवल" आंशिक अनुप्रयोग होना चाहिए। बंद करने का उपयोग एक आंतरिक कार्यान्वयन विवरण है जो सीधे कॉलर के संपर्क में नहीं आता है। – user2864740

उत्तर

7

partial आंशिक कार्य करने के लिए बंद करने का उपयोग करता है। प्रति (source partial) का उपयोग कर partial का कोड देखें और आप देखेंगे कि यह बंद करने का उपयोग करता है।

(defn partial 
    "Takes a function f and fewer than the normal arguments to f, and 
    returns a fn that takes a variable number of additional args. When 
    called, the returned function calls f with args + additional args." 
    {:added "1.0"} 
    ([f arg1] 
    (fn [& args] (apply f arg1 args))) 
    ([f arg1 arg2] 
    (fn [& args] (apply f arg1 arg2 args))) 
    ([f arg1 arg2 arg3] 
    (fn [& args] (apply f arg1 arg2 arg3 args))) 
    ([f arg1 arg2 arg3 & more] 
    (fn [& args] (apply f arg1 arg2 arg3 (concat more args))))) 
+0

ऐसा क्यों लिखा जाता है? मैं अभी अभी सीख रहा हूं और [एफ arg1] अनावश्यक लगता है क्योंकि एक "varargs" कार्यान्वयन (एक और अधिक के साथ) – themistoklik

+0

एक सुरक्षित शर्त यह सबसे आम मामलों को अनुकूलित करना होगा – Sushisource

0

(partial + 5) एक गुमनाम समारोह या "लैम्ब्डा" है।

बेनामी कार्यों को अक्सर "बंद" कहा जाता है लेकिन यह शब्द का दुरुपयोग है; में "What is the difference between a 'closure' and a 'lambda'?"


[¹] चर्चा को देखें हो सकता है कि क्योंकि सबसे लोकप्रिय भाषाओं कि उन्हें समर्थन में, बंद और अनाम प्रक्रियाएं एक ही भाषा सुविधाओं का उपयोग कर बनाई गई हैं - जो उन्हें पहली नजर में समाधान के अयोग्य बना देता है।

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