2009-10-08 10 views
15

क्लोजर पर प्रलेखन पर बारीकी से देखकर, मुझे प्रत्यक्ष पुष्टि नहीं है कि क्लोजर ऑपरेटर ओवरलोडिंग का समर्थन करता है या नहीं।क्लोजर

यदि ऐसा होता है, तो क्या कोई मुझे अधिभारित करने के बारे में त्वरित स्निपलेट प्रदान कर सकता है, मान लें कि "+" ऑपरेटर कुछ पूर्वनिर्धारित विधि को प्रतिनिधि करने के लिए है जिसे हम myPlus पर कॉल कर सकते हैं।

मैं बहुत क्लोजर के लिए नया हूं, इसलिए यहां किसी की सहायता की सराहना की जाएगी। , http://clojure.org/multimethods

कुछ कार्यों + जैसे प्रमुख कर रहे हैं और नए सिरे से परिभाषित नहीं किया जा सकता:

उत्तर

23

क्लोजर (जैसा कि किसी भी लिस्प के) ऑपरेटर सादे कार्य होते हैं; आप एक समारोह की तरह एक "ऑपरेटर" को परिभाषित कर सकते हैं:

(defn ** [x y] (Math/pow x y)) 

"+" ऑपरेटर (और कुछ अन्य गणित ऑपरेटरों) Clojure में एक विशेष मामला है, क्योंकि यह द्विआधारी मामले के लिए (inlined है, कम से कम है)। आप अपने नामस्थान में clojure.core (या clojure.core/+ को छोड़कर) का जिक्र नहीं कर सकते हैं, लेकिन यह बहुत बालों वाली हो सकती है।

(ns my-ns 
    (:refer-clojure :exclude [+])) 

(defn + [x y] (println x y)) 

(+ "look" "ma") 

एक अच्छी रणनीति शायद अपने + एक multimethod बनाने के लिए और संख्यात्मक मामलों के लिए कोर के + समारोह कॉल करने के लिए होगा:

एक नाम स्थान जहां + नए सिरे से परिभाषित बनाने के लिए।

+0

तो, अगर मैं clojure.core/+ को बाहर करना था, तो मैं निम्नलिखित (defn + [xy] (myPlus xy)) सही? यदि हां, तो वही है जो मैं करना चाहता हूं। मैं अपने नेमस्पेस से clojure.core/+ को कैसे बाहर निकालूं? –

+0

मैंने इसे अपने उत्तर में जोड़ा है। – pmf

+0

बिंगो, बिल्कुल मैं क्या देख रहा हूँ! धन्यवाद। –

4

इस पर एक नजर डालें।

आप एक नया फ़ंक्शन बना सकते हैं और इसे "। +" या "! +" कहते हैं, उदाहरण के लिए, जो पठनीयता के मामले में समान है।

ऊपर शामिल multimethods यूआरएल में जानकारी का उपयोग करके, आप एक समारोह बना सकते हैं जो आपके बारे में बताता है। + जिसका उपयोग करने के लिए कार्यान्वयन।

+0

आपने अपने प्रश्न का उत्तर एक तरफ या दूसरे जवाब नहीं दिया। – chollida

+0

मैंने और जानकारी जोड़ दी है। – z5h

+0

अद्यतन वास्तव में यह एक बेहतर जवाब बनाने में मदद करते हैं! – chollida