2012-10-07 11 views
6

मैं labrepl के माध्यम से अपने रास्ते काम कर रहा हूँ और मैं कुछ कोड है कि इस पद्धति का अनुसरण करता देखा:clojure: (एफ एन coll लागू) बनाम (लागू # (लागू fn% और) coll)

;; Pattern 
(apply #(apply f %&) coll) 

;; Concrete example 
user=> (apply #(apply + %&) [1 2 3 4]) 
10 

यह प्रतीत हो रहा है इस पैटर्न के बराबर:

;; Pattern 
(apply f coll) 

;; Concrete example 
user=> (apply + [1 2 3 4]) 
10 

क्या ये पैटर्न समकक्ष हैं? यदि नहीं, तो क्या अंतर है और आप दूसरे पर एक का उपयोग कब करेंगे?

मैं labrepl के सेलुलर-ऑटोमेटा प्रयोगशाला में step function से पूर्व पैटर्न ले लिया:

(defn step 
    "Advance the automation by one step, updating all cells." 
    [board] 
    (doall 
    (map (fn [window] 
      (apply #(apply map brians-brain-rules %&) 
       (doall (map torus-window window)))) 
     (torus-window board)))) 

अद्यतन: मैं मदद करने के लिए सवाल स्पष्ट करने के लिए प्रत्येक पैटर्न की एक ठोस उदाहरण गयी।

उत्तर

4

नहीं, इसमें कोई फर्क नहीं पड़ता। लंबा फॉर्म लिखने का कोई कारण नहीं है; मैं केवल यह मान सकता हूं कि यह कोड में क्रमिक परिवर्तनों से आया था जो एक समय में समझ में आया था।

+0

से सहमत प्रश्न को संपादित किया। मैंने सोचा कि शायद पैरामीटर एक फर्क पड़ सकता है, लेकिन (लागू # (लागू करें (एफएन [सी] (मानचित्र + सी [1 1 1]))% और) [[-1 -1 -1]]) '' (लागू करें (एफएन [सी] (मानचित्र + सी [1 1 1])) [[-1 -1 -1]]) 'बराबर थे। – noahlz

0

अनिवार्य रूप से, दोनों रूप एक ही चीज़ को पूरा करते हैं और कम या कम होते हैं। प्रत्येक एक अज्ञात समारोह शुरू करने का एक तरीका प्रदान करता है।

#(... का उपयोग एक अज्ञात फ़ंक्शन के लिए क्लोजर रीडर शॉर्टैंड है। यह (fn [arg1 & args]... के बराबर है, लेकिन आप एक #(... किसी अन्य के अंदर अज्ञात फ़ंक्शन को एम्बेड नहीं कर सकते हैं, और वेक्टर बाध्यकारी (fn [arg & args] के बजाय तर्क % %2... या %1 %2... के रूप में व्यक्त किए जाते हैं।

दोनों अज्ञात फ़ंक्शन को व्यक्त करने के तरीके हैं। #(... सरल कार्यों के लिए उपयोग किया जाता है, और (fn... का उपयोग अधिक विस्तृत कार्यों के लिए किया जाता है।

#(... चीजों को थोड़ा साफ दिखने के लिए प्रेरित करता है।

+1

नहीं ... क्यों दो कार्य लागू करते हैं? – noahlz

+0

मेरा प्रश्न अज्ञात कार्यों के लिए विभिन्न वाक्यविन्यासों के बारे में नहीं है। मैंने इसे स्पष्ट करने के लिए अपने प्रश्न में उदाहरण जोड़े। – rigdern

+0

किसी भी funcion का प्रतिनिधित्व करने के लिए 'fn' का उपयोग कर @rigdern भ्रामक है, मैंने – soulcheck

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