2009-03-24 6 views
15

मैं, (आरईपीएल में या कहीं भी)क्लोजर में स्ट्रिंग से फ़ंक्शन को कैसे डिफॉल्ट करें?

(defn (symbol "print-string") [k] (println k)) 

ऐसा करने के लिए और फिर

(print-string "lol") 

ऐसा करने में सक्षम होना चाहते हैं या यदि वहाँ में कस्टम तार से defn बनाने के लिए किसी अन्य तरीके से है मैक्रोज़, क्या आप मुझे सही दिशा में धक्का दे सकते हैं?

उत्तर

21
(defmacro defn-with-str [string args & body] 
`(defn ~(symbol string) ~args [email protected])) 

(defn-with-str "print-string" [k] (println k)) 

(print-string "lol") 
+0

1. में समारोह नाम स्ट्रिंग args के सामने ~ क्या है? 2. शरीर के सामने ~ @ क्या है? – Belun

+1

@ बेलन 1. ~ = unquote 2. ~ @ = विस्तार अनुक्रम – Surya

+0

ऐसा क्यों है कि अगर मैं करता हूं (defn defs [] (doall (map (fn [s] (defn-with-str s [k] (println k))) ["प्रिंट-स्ट्रिंग"]))) मुझे एक एफएन कहा जाता है जिसे 'एस' कहा जाता है? – Hendekagon

14

मैं बेहतर dnolen पसंद का जवाब है, लेकिन आप यह भी कर सकते हैं:

(defn #=(symbol "print-string") [k] (println k))

#=() पढ़ने के समय में मूल्यांकन किया जाता है। मुझे नहीं पता कि क्लोजर की एक विशेषता कितनी स्थिर है, मैं इस पर भरोसा नहीं रखूंगा कि भविष्य में बदलाव न करें। मैक्रोज़ मैं कैसे करूँगा।

17

डोनोले का समाधान मैक्रो विस्तार समय पर काम करता है, ब्रायन कार्पर रीड-टाइम पर काम करता है। अब, यहाँ चलाने के समय के लिए एक है:

(intern *ns* (symbol "a") (fn [k] (println k))) 
+0

कूल इसके बारे में नहीं पता था। एक चेतावनी यह है कि var w में फ़ंक्शन मेटाडेटा अनुपलब्ध होगा जिसे आप defn का उपयोग करने से प्राप्त करते हैं। – dnolen

7

FYI करें - dnolen का जवाब केवल def'd या let'd चर में स्ट्रिंग्स के लिए नहीं शाब्दिक तार के लिए काम करेंगे, और।

(defmacro defn-साथ-str [स्ट्रिंग args & शरीर] `(defn ~ (प्रतीक स्ट्रिंग) ~ आर्ग ~ @ शरीर))

(def" हाय "hisym) (defn-हूँ- str hisym []) ("हाय" println)

अब आप एक समारोह में कहा जाता है "hisym"

(hi) -> java.lang.Exception: प्रतीक को हल करने में असमर्थ: हाय इस संदर्भ में (NO_SOURCE_FILE : 6) (herym) -> प्रिंट "हाय"

,210

इससे बचने के लिए, eval मैक्रो

(defmacro defn-with-str [string args & body]
`(defn ~(symbol (eval string)) ~args [email protected]))

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