2013-02-09 14 views
9

उदाहरण:Clojure :: arity-अतिभारित कार्यों बुला Clojure (<a href="http://en.wikibooks.org/wiki/Clojure_Programming/Examples/Cookbook">cookbook</a> से लिया गया) निम्नलिखित जैसे कार्यों पर arity-अधिक भार की एक दूसरे को

(defn argcount 
    ([] 0)        ; Zero arguments 
    ([x] 1)        ; One argument 
    ([ x & args] (inc (count args)))) ; List of arguments 

... एक रूप है जो दिखाई नहीं देता का उपयोग कम धर्मार्थ के कार्यों को केवल कुछ डिफ़ॉल्ट मानों के साथ उच्च धैर्य के कार्यों को कॉल करने की अनुमति दें (यह जावा में एक सामान्य मुहावरे है)। क्या इसके लिए कुछ अन्य विशेष रूप इस्तेमाल किया गया है?

+3

ऐसा करने के दो तरीके हैं, और इस सवाल का पहले से ही StackOverflow पर जवाब दिया गया है। दूसरे पर विशेष ध्यान दें, बाद में उत्तर दें: http://stackoverflow.com/a/8660833/152739 – Scott

+0

मेरे लिए ठीक काम करने लगता है: उपयोगकर्ता => (defn f ([] (f 1)) ([ एक्स] एक्स)) # 'उपयोगकर्ता/एफ उपयोगकर्ता => (एफ) 1 –

उत्तर

13

आम तौर पर एक तरह से है कि उच्च आदेश कार्यों और map/reduce का उपयोग अन्य arities का उल्लेख करने की जरूरत नहीं है में उच्च arity तर्क व्यक्त करने के लिए एक अच्छा तरीका है। इस मामले में यह बहुत सरल है:

(defn argcount 
    ([] 0) 
    ([x] 1) 
    ([x & args] 
    (reduce + 1 (map (constantly 1) args)))) 

सूचना अभिव्यक्ति के सामान्य रूप है:

(reduce reducing-function arity-1-value (map mapping-function rest-of-args)) 

आप सब कुछ इस तरह से नहीं कर सकते हैं, लेकिन यह बहु की एक आश्चर्यजनक रूप से बड़ा हिस्सा के लिए काम करता तर्क कार्यों।

(apply argcount (take 10000000 (range))) 
=> 10000000 

कि कोशिश करो सबसे अन्य भाषाओं में और अपने ढेर हो जाएगा टोस्ट :-): यह भी, map का उपयोग कर तो आप थोड़ा डर के साथ एक समारोह के लिए एक करोड़ तर्क पास की तरह पागल कर सकते हैं आलस्य से advnatages लाभ

3

मिकरा का जवाब शानदार है; मैं बस एक अतिरिक्त विधि जोड़ूँगा। जब ओवरलोडेड फ़ंक्शन के लिए डिफ़ॉल्ट मान की आवश्यकता होती है, तो स्थानीय का उपयोग किया जा सकता है।

नीचे उदाहरण प्रभाग में, स्थानीय को संख्याओं और परिशुद्धता की आवश्यकता होती है। परिभाषित फ़ंक्शन एक डिफ़ॉल्ट मान के साथ परिशुद्धता को अधिभारित करता है।

(def overloaded-division 
(let [divide-with-precision 
    (fn [divisor dividend precision] 
    (with-precision precision (/ (bigdec divisor) (bigdec dividend))))] 
    (fn 
     ;lower-arity calls higher with a default precision. 
     ([divisor dividend] (divide-with-precision divisor dividend 10)) 
     ;if precision is supplied it is used. 
     ([divisor dividend precision] (divide-with-precision divisor dividend precision))) 
    ) 
) 

जब निचले arity में कहा जाता है, डिफ़ॉल्ट इसे लागू किया:

user=> (overloaded-division 3 7) 
0.4285714286M 
user=> (overloaded-division 3 7 40) 
0.4285714285714285714285714285714285714286M