एक क्लोजर फ़ंक्शन को पैरामीटर की एक चर संख्या लेने के लिए कैसे करें?


81

मैं क्लजुरे सीख रहा हूं और मैं एक फ़ंक्शन को परिभाषित करने की कोशिश कर रहा हूं जो मापदंडों की एक चर संख्या (एक चर समारोह) लेता है और उन्हें योग करता है (हां, + प्रक्रिया की तरह)। हालाँकि, मैं नहीं जानता कि इस तरह के समारोह को कैसे लागू किया जाए

सब कुछ मैं कर सकता हूँ:

(defn sum [n1, n2] (+ n1 n2))

बेशक यह फ़ंक्शन केवल दो पैरामीटर और दो पैरामीटर लेता है। कृपया मुझे सिखाएं कि इसे कैसे स्वीकार करें (और प्रक्रिया) मापदंडों की एक अपरिभाषित संख्या।

जवाबों:


108

सामान्य तौर पर, गैर-कम्यूटेटिव केस जिसे आप लागू कर सकते हैं :

(defn sum [& args] (apply + args))

चूँकि यह सराहनीय है, इसलिए कुछ इस तरह से भी काम करना चाहिए:

(defn sum [& args] (reduce + args))

&argsतर्क सूची के शेष भाग के लिए बाध्य होने का कारण बनता है (इस मामले में पूरी सूची, क्योंकि बाईं ओर कुछ भी नहीं है &)।

इसके बजाय स्पष्ट रूप से परिभाषित करने का योग, इससे कोई मतलब नहीं है:

(sum a b c d e ...)

आप बस लिख सकते हैं:

(+ a b c d e ....)

3
हाँ, यह स्पष्ट नहीं है, लेकिन यह आपके उत्तर के लिए एक अच्छा चित्रण है। धन्यवाद।
रॉडरिगोलेसिवेइरा

@soulcheck: seqआपके योग फ़ंक्शन को पास करने का एक तरीका है । उदाहरण के लिए: (राशि '(1 2 3)) और परिणाम 6 है?
अविचल

@avichalp जो एक और फंक्शन होगा। बस &या तो संस्करण से हटा दें
आत्मिक परीक्षण

1
@soulcheck: नहीं। मेरा मतलब समान फ़ंक्शन हस्ताक्षर का उपयोग करना है। मैं क्लोजर में नौसिखिया हूं इसलिए मैं अपनी बात यहां स्पष्ट रूप से कहने में सक्षम हूं। जो मैं जानना चाहता हूं वह अजगर में है मैं * आर्ग्स का उपयोग कर सकता हूं और यदि कोई फ़ंक्शन इस तरह परिभाषित किया गया है कि यह def fn(*args): pass* आर्ग्स लेता है (उदाहरण के लिए ) मैं इसे fn (* list_of_args) जैसी सूची देकर कह सकता हूं। क्या मैं क्लोजर में एक ही काम कर सकता हूं?
अविकल्प

@avichalp कॉल def fn(*args): passनहीं होगा, fn([1,2,3])लेकिन fn(1,2,3)(स्पष्ट रूप से आप जो करना चाहते हैं, उसके आधार पर, लेकिन मैं यहां भावना का पालन करने की कोशिश कर रहा हूं)
आत्माचेक

31

योहानाथन में ओवरलोडिंग के बारे में बताया गया है लेकिन इसका प्रत्यक्ष उदाहरण नहीं मिलता है। यहां वह बात कर रहा है:

(defn special-sum
  ([] (+ 10 10))
  ([x] (+ 10 x))
  ([x y] (+ x y)))

(special-sum) => 20

(special-sum 50) => 60

(special-sum 50 25) => 75


लैम्ब्डा के साथ भी काम करता है:(fn ([] (+ 10 10)) ([x] (+ 10 x)) ([x y] (+ x y)))
एरिक कपलुन

17
 (defn my-sum
  ([]  0)                         ; no parameter
  ([x] x)                         ; one parameter
  ([x y] (+ x y))                 ; two parameters
  ([x y & more]                   ; more than two parameters


    (reduce + (my-sum x y) more))
  )

10

defnएक मैक्रो है जो कार्यों को थोड़ा सरल बनाता है। क्लोजर एकल फ़ंक्शन ऑब्जेक्ट, सेल्फ-रेफरेंस और वेरिएबल-एरिटी फ़ंक्शंस का उपयोग करते हुए एरिटी ओवरलोडिंग का समर्थन करता है&

से http://clojure.org/functional_programming


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.