2012-08-03 12 views
32

मैं clojure स्रोत ब्राउज़ कर रहा था और मैं जिस तरह से आश्चर्यचकित था जब मैक्रो परिभाषित किया गया है:clojure जब मैक्रो

user=> (source when) 
(defmacro when 
    "Evaluates test. If logical true, evaluates body in an implicit do." 
    {:added "1.0"} 
    [test & body] 
    (list 'if test (cons 'do body))) 
nil 
user=> 

मैं इसे उम्मीद कर रहा था बजाय कुछ इस तरह लिखा होना चाहिए:

(defmacro when [test & body] `(if ~test (do [email protected]))) 

वास्तविक मैक्रो इस कम सामान्य तरीके से क्यों लिखा गया था?

उत्तर

67

core.clj शीर्ष से नीचे तक बनाया गया है, जो जावा प्रदान करता है और क्लोजर के लिए सभी आवश्यकताओं को पूरा करता है। जब when परिभाषित किया गया है वाक्यविन्यास उद्धरण अभी तक मौजूद नहीं है।
when मैक्रो core.clj की line 456 पर परिभाषित किया गया है और वाक्य रचना-उद्धरण के लिए आवश्यकताओं को उपलब्ध नहीं हैं जब तक line 682.जब मैक्रो के हवाले से वाक्य रचना को परिभाषित करने के

+4

प्रयोग किया जाता है काश मैं था अधिक को वोट देने के लिए इस । –

+1

रेखा 680 defmulti मैक्रो प्रतीत होता है। और वाक्यविन्यास उद्धरण (मुझे लगता है) एक पाठक मैक्रो है। क्या आप सिंटैक्स उद्धरण के लिए बिल्कुल फ़ंक्शन/मैक्रो की आवश्यकता के बारे में विस्तार कर सकते हैं? – Kevin

+0

केविन, आप उन पंक्ति संख्याओं के पीछे लिंक का पालन क्यों नहीं करते हैं। लाइन 682 पर या उसके पास कोई 'defmulti' नहीं है, इसलिए आप शायद इस फ़ाइल के किसी अन्य संस्करण को देख रहे हैं। सिंटैक्स उद्धरण के लिए क्या आवश्यक है, यह सरल है: ** फ़ाइल के इस विशेष संस्करण में पंक्ति 682 ** से ऊपर परिभाषित सब कुछ। –