2011-11-03 17 views
13

मैंने दो सेटों के सममित अंतर की गणना करने के लिए एक समारोह लिखा (4clojure साइट पर समस्याओं में से एक)। समारोह ने इकाई परीक्षण पास किए, लेकिन यह उतना साफ नहीं है जितना मैं चाहूंगा, क्योंकि मेरे पास डुप्लिकेट कोड है।क्लोजर में किसी फ़ंक्शन के भीतर फ़ंक्शन को परिभाषित कैसे किया जाए और उस संदर्भ को संदर्भित किया जाए?

(fn [x y] (set (concat 
    (keep-indexed #(if (nil? (get y %2)) %2) x) 
    (keep-indexed #(if (nil? (get x %2)) %2) y)))) 

जाहिर है मैं की तरह कुछ पसंद करेंगे:

(fn [x y] (set (concat (diff x y) (diff y x)))) 

कहाँ diff समारोह में परिभाषित किया गया है और संदर्भित "इनलाइन" है, लेकिन मैं ऐसा करने के लिए कैसे एक fn ब्लॉक में पता नहीं है।

(fn [x y] 
    (let [diff (... function body here ...)] 
    (set 
    (concat (diff x y) (diff y x))))) 
+2

आप वास्तव में 4clojure पर अन्य लोगों के उत्तरों को देख सकते हैं (एक बार जब आप प्रश्न पूरा कर लेंगे) जो आपको एक विचार दे सकता है कि आप अपने प्रयासों को कैसे व्यवस्थित कर सकते हैं। –

उत्तर

21

एक let या letfn का प्रयोग करें। जब आप (defn name [arg] ...) के साथ फ़ंक्शन बनाते हैं तो फ़ंक्शन बनाता है और फिर इसे एक var में संग्रहीत करता है ताकि आप इसे बाद में अपने प्रोग्राम में कहीं से भी ढूंढ सकें। यह बहुत कुछ है:

(def name (fn [arg] ...)) 

अब नाम में एक ऐसा फ़ंक्शन है जो व्यापक रूप से सुलभ है। कार्यों को युद्धों में संग्रहित नहीं किया जाना चाहिए, खासकर अगर उन्हें केवल आपके कार्य में ही जरूरी है। उस मामले में यह फ़ंक्शन को स्थानीय नाम पर मैट फेनविक उत्तर के साथ बाध्य करने के लिए और अधिक समझ में आता है।

(let [name (fn [agr] ...)] ...) 

letfn मैक्रो इस और अधिक सुरुचिपूर्ण बनाता है। महत्वपूर्ण हिस्सा यह समझना है कि कार्य वे वस्तुएं हैं जो चीजों में संग्रहित होती हैं, और आप अपनी आवश्यकताओं के अनुरूप कंटेनर चुन सकते हैं।

10

Clojure एक तुतलाना (और सामान्य में एक कार्यात्मक भाषा) करता है कि सुविधाओं में से एक यह है कि कार्यों प्रथम श्रेणी बातें Clojure में विशेष रूप से वे वस्तुओं हैं:

+1

आपने क्यों कहा "महत्वपूर्ण हिस्सा यह समझना है कि कार्य ** ** वस्तुएं हैं जो चीजों में संग्रहित हैं"? "ऑब्जेक्ट" कहने से किसी को यह सोचने का मौका मिल सकता है कि आप वस्तु-उन्मुख अर्थ में वस्तुओं के बारे में बात कर रहे हैं। लोअरकेस "ऑब्जेक्ट", मुझे लगता है, यहां बेहतर हो सकता है। (मैं समझता हूं कि क्लोजर JVM पर लागू किया गया है, जहां ओओ क्लासेस और ऑब्जेक्ट्स के रूप में कई चीजें लागू की जाती हैं, लेकिन मुझे नहीं लगता कि नए क्लोजुरियनों को कार्यान्वयन के विवरणों के बारे में सोचने की आवश्यकता है।) –

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

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