खोज…


कार्य को परिभाषित करना

कार्यों को पांच घटकों के साथ परिभाषित किया गया है:

हेडर, जिसमें defn कीवर्ड, फ़ंक्शन का नाम शामिल है।

(defn welcome ....)

एक वैकल्पिक Docstring जो यह बताता है कि फ़ंक्शन क्या करता है और दस्तावेज़ करता है।

(defn welcome 
    "Return a welcome message to the world"
     ...)

कोष्ठक में सूचीबद्ध पैरामीटर।

(defn welcome 
    "Return a welcome message"
    [name]
    ...)

शरीर, जो उन प्रक्रियाओं का वर्णन करता है जो फ़ंक्शन करता है।

(defn welcome 
    "Return a welcome message"
    [name]
    (str "Hello, " name "!"))

इसे कॉल करना:

=> (welcome "World")

"Hello, World!"

पैरामीटर और एरीटी

क्लोजर फ़ंक्शन को शून्य या अधिक मापदंडों के साथ परिभाषित किया जा सकता है।

(defn welcome
    "Without parameters"
    []
    "Hello!")

(defn square
    "Take one parameter"
    [x]
    (* x x))

(defn multiplier
    "Two parameters"
    [x y]
    (* x y))

arity

एक फ़ंक्शन के तर्कों की संख्या। फ़ंक्शंस, एरिटी ओवरलोडिंग का समर्थन करते हैं, जिसका अर्थ है कि क्लोज़र में फ़ंक्शन तर्कों के एक से अधिक "सेट" के लिए अनुमति देते हैं।

(defn sum-args
  ;; 3 arguments
  ([x y z]
     (+ x y z))
  ;; 2 arguments
  ([x y]
     (+ x y))
  ;; 1 argument 
  ([x]
     (+ x 1)))

समान कार्य करने के लिए arities को नहीं करना है, प्रत्येक arrel असंबंधित कुछ कर सकते हैं:

(defn do-something
  ;; 2 arguments
  ([first second]
     (str first " " second))
  ;; 1 argument 
  ([x]
     (* x x x)))

वैरेडिक फ़ंक्शंस को परिभाषित करना

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

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

(defn sum-and-multiply [x & args]
  (* x (apply + args)))

कॉलिंग:

=> (sum 1 11 23 42)
77

=> (sum-and-multiply 2 1 2 3)  ;; 2*(1+2+3)
12

अनाम कार्यों को परिभाषित करना

अनाम फ़ंक्शन को परिभाषित करने के दो तरीके हैं: पूर्ण सिंटैक्स और एक आशुलिपि।

पूर्ण बेनामी समारोह सिंटेक्स

(fn [x y] (+ x y))

यह अभिव्यक्ति एक फ़ंक्शन का मूल्यांकन करती है। किसी भी वाक्यविन्यास का उपयोग आप defn साथ परिभाषित फ़ंक्शन ( & , तर्क विनाशकारी, आदि) के साथ कर सकते हैं, आप fn फॉर्म के साथ भी कर सकते हैं। defn वास्तव में एक मैक्रो है जो बस करता है (def (fn ...))

शॉर्टहैंड बेनामी फ़ंक्शन सिंटैक्स

#(+ %1 %2)

यह शॉर्टहैंड नोटेशन है। आशुलिपि संकेतन का उपयोग करना, आपको स्पष्ट रूप से तर्क का नाम नहीं देना है; उन्हें नाम %1 , %2 , %3 और इसी तरह उनके द्वारा दिए गए आदेश के अनुसार सौंपा जाएगा। यदि फ़ंक्शन में केवल एक तर्क है, तो उसके तर्क को % कहा जाता है।

जब प्रत्येक का उपयोग करने के लिए

शॉर्टहैंड नोटेशन की कुछ सीमाएँ हैं। आप एक तर्क को नष्ट नहीं कर सकते हैं, और आप शॉर्टहैंड गुमनाम कार्यों को नहीं कर सकते। निम्न कोड एक त्रुटि फेंकता है:

(def f #(map #(+ %1 2) %1))

सिंटेक्स का समर्थन किया

आप शॉर्टहैंड अनाम फ़ंक्शंस के साथ varargs का उपयोग कर सकते हैं। यह पूरी तरह से कानूनी है:

#(every? even? %&)

यह तर्कों की एक परिवर्तनीय संख्या लेता है और यदि उनमें से हर एक भी सही है, तो रिटर्न:

(#(every? even? %&) 2 4 6 8)
;; true
(#(every? even? %&) 1 2 4 6)
;; false

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

(fn addition [& addends] (apply + addends))


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow