2009-08-23 20 views
11

के लिए समानार्थी परिभाषित करें तो Clojure macro to create a synonym for a function से निम्न पर, मैंने पाया कि डीफ़ का उपयोग मैक्रो के समानार्थी को परिभाषित करने के लिए नहीं किया जा सकता है। नीचे उदाहरण हैं कि मैंने कोशिश की कि क्लोजर की अनुमति नहीं है।क्लोजर मैक्रो

;(def def-function defn) 
;(def case cond) 
;(def function fn) 

क्या क्लोजर में मैक्रोज़ के लिए समानार्थी/उपनाम परिभाषित करना संभव है? क्या इसे डिफैक्रो का उपयोग करने की आवश्यकता होगी?

उत्तर

8

आप मैक्रो का उपयोग कर सकते हैं:

user=> (defmacro def-function [& args] `(defn [email protected])) 
#'user/def-function 
user=> (def-function g [] 2) 
#'user/g 
user=> (g) 
2 

या आप clojure.contrib.def/defalias उपयोग कर सकते हैं:

user=> (use 'clojure.contrib.def) 
nil 
user=> (defalias def-function defn) 
#'user/def-function 
user=> (def-function g [] 2) 
#'user/g 
user=> (g) 
2 
+3

ऐसी कोई चीज़ नहीं है जैसे 'clojure.contrib.def' और भी। https://groups.google.com/forum/#!topic/clojure/LhidPSlvX_Q – micrub

3

ऐसा करने के लिए, संक्षेप में, आपको मैक्रो को फिर से लिखना होगा जैसा मूल मूल रूप से एक अलग नाम को प्रतिस्थापित कर रहा है (आप निश्चित रूप से ऐसा करने के लिए defmacro का उपयोग करेंगे)। यह एकमात्र तरीका है क्योंकि यह संभव है क्योंकि मैक्रोज़ कोई मान नहीं लौटाते हैं, लेकिन बाद में कोड लिखते हैं जिसे बाद में मूल्यांकन किया जाना है।

Def को कोड के ब्लॉक के बजाय किसी मान को बाध्य करने की आवश्यकता है।

(डीईएफ़ प्रतीक init?)

बनाता है और इंटर्न या प्रतीक के नाम और वर्तमान नाम स्थान का मूल्य (एनएस) के एक नाम स्थान के साथ एक वैश्विक वर स्थित। यदि init की आपूर्ति की जाती है, तो इसका मूल्यांकन किया जाता है, और var की मूल बाध्यकारी परिणामस्वरूप मान पर सेट होती है। यदि init की आपूर्ति नहीं की जाती है, तो var की जड़ बाध्यकारी अप्रभावित है। def हमेशा रूट बाइंडिंग पर लागू होता है, भले ही var उस बिंदु पर थ्रेड-बाध्य है जहां डीफ़ कहा जाता है। def var स्वयं उत्पन्न करता है (इसका मूल्य नहीं)। यदि प्रतीक पहले ही नामस्थान में है और एक इंटर्न वाले var में मैप नहीं किया गया है तो अपवाद फेंकता है।

Clojure: Special Forms

मैक्रो से उनके रूपों का मूल्यांकन नहीं है:

मैक्रो कार्यों कि रूपों में हेरफेर, वाक्यात्मक अमूर्त के लिए अनुमति देता है। यदि कॉल का ऑपरेटर एक प्रतीक है जो एक वैश्विक वैर का नाम है जो मैक्रो फ़ंक्शन है, तो मैक्रो फ़ंक्शन कहा जाता है और को अनावश्यक ऑपरेंड फॉर्म [इटालिक्स मेरा] पास किया जाता है। मैक्रो का वापसी मूल्य उसके स्थान पर मूल्यांकन किया जाता है।

Clojure: Evaluation

संक्षेप में से

, मैक्रो के बिंदु मूल्यांकन देरी करने के लिए है, इसलिए def एक प्रतीक करने के लिए बाध्य करने के लिए के लिए यह एक मूल्य प्रदान नहीं कर सकते।

+0

स्पष्टीकरण के लिए धन्यवाद! –

29

मई ध्वनि (लाइन-) शोर लेकिन

(def #^{:macro true} case #'cond) 

काम करता है!

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