2009-04-04 12 views
51

कॉमन लिस्प में आप यह कर सकते हैं:Clojure कीवर्ड तर्क

(defun foo (bar &key baz quux) 
    (list bar baz quux)) 

(foo 1 :quux 3 :baz 2) ; => (1 2 3) 

Clojure कीवर्ड तर्क नहीं है।

(defn foo [bar {:keys [baz quux]}] 
    (list bar baz quux)) 

(foo 1 {:quux 3 :baz 2}) ; => (1 2 3) 

टाइप करें और हर समय पढ़ने के लिए करने के लिए कई सारे नेस्टेड कोष्ठक है कि: एक विकल्प यह है। इसे एक स्पष्ट सूची के बजाय एक तर्क के रूप में पारित होने के लिए एक स्पष्ट हैश-मानचित्र की भी आवश्यकता होती है।

कीवर्ड तर्कों के बराबर सबसे बेवकूफ क्लोजर क्या है जो किसी को विराम चिह्न बम को सेट नहीं करता है?

+3

के बाद से इस सवाल का अंतिम सक्रिय कीवर्ड destructuring बाध्यकारी Clojure में जोड़ दिया गया था। मैंने इसे इंगित करने का उत्तर दिया है। –

+1

@ ब्रायन आपको स्वीकृत उत्तर को अपडेट करने पर विचार करना चाहिए। –

उत्तर

39

clojure में कीवर्ड आर्ग अनुकरण करने के लिए एक आसान तरीका इस तरह बाकी मानकों पर हैश मानचित्र का उपयोग किया जाता है:

> (defn kwtest [x & e] (:foo (apply hash-map e))) 
#'user/kwtest 
> (kwtest 12 :bar "ignored" :foo "returned") 
"returned" 

रिच हिक्की this message from the clojure google group में किसी मैक्रो बशर्ते कि आप कीवर्ड पैरामीटर देता है। corresponding thread में जानकारी है कि कीवर्ड पैरामीटर क्लोजर द्वारा समर्थित क्यों नहीं हैं। मूल रूप से रनटाइम ओवरहेड से बचने के लिए। रिच विधि मैं ऊपर this message

+0

देखें [एलेक्स स्टोडर्ड का जवाब] (http://stackoverflow.com/questions/717963/clojure-keyword-arguments/3969693#3969693); कीवर्ड तर्कों के लिए समर्थन पैरामीटर बाध्यकारी में जोड़ा गया है। –

10

में clojure.contrib.def में हाल ही में इसके अलावा defnk मैक्रो है दिखाया है, जो खोजशब्द तर्क के साथ कार्य (here देखें) की परिभाषा के लिए सक्षम बनाता बताते हैं।

94

Clojure 1.2 के लिए इस उत्तर को अपडेट करने के destructuring binding के नक्शे रूपों द्वारा प्रदान की चूक के साथ अब पूरा कीवर्ड आर्ग समर्थन है:

user> (defn foo [bar &{ :keys [baz quux] 
         :or {baz "baz_default" quux "quux_default"}}] 
     (list bar baz quux)) 
#'user/foo 

user> (foo 1 :quux 3) 
(1 "baz_default" 3) 
+7

मुझे लगता है कि इसे उत्तर देने के लिए प्रोत्साहित किया जाना चाहिए? – john2x

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