2012-08-30 6 views
7

मैं defmacro जो का उपयोग करता है के लिए स्रोत को देखकर किया गया है "चलो" अपनी परिभाषा:क्लोजर में डिफैमक्रो को स्वयं के संदर्भ में कैसे परिभाषित किया जा सकता है?

(defmacro let 
    "binding => binding-form init-expr 

    Evaluates the exprs in a lexical context in which the symbols in 
    the binding-forms are bound to their respective init-exprs or parts 
    therein." 
    {:added "1.0", :special-form true, :forms '[(let [bindings*] exprs*)]} 
    [bindings & body] 
    (assert-args 
    (vector? bindings) "a vector for its binding" 
    (even? (count bindings)) "an even number of forms in binding vector") 
    `(let* ~(destructure bindings) [email protected])) 

कोई व्याख्या कर सकते हैं कैसे:

(def 

^{:doc "Like defn, but the resulting function name is declared as a 
    macro and will be used as a macro by the compiler when it is 
    called." 
    :arglists '([name doc-string? attr-map? [params*] body] 
       [name doc-string? attr-map? ([params*] body)+ attr-map?]) 
    :added "1.0"} 
defmacro (fn [&form &env 
       name & args] 
      (let [prefix (loop [p (list name) args args] 

हालांकि, "दो" एक मैक्रो खुद के रूप में परिभाषित किया गया है यह काम करता है क्योंकि मैं समझ नहीं पा रहा हूं कि "defmacro" को उन चीज़ों के संदर्भ में कैसे परिभाषित किया जा सकता है जिन्हें पहले से परिभाषित करने के लिए "defmacro" की आवश्यकता होती है। (अगर यह समझ में आता है :)

उत्तर

5

रिक्रेशिव मैक्रोज़ ठीक काम करते हैं और क्लोजर भाषा कोर और अन्य कार्यक्रमों में कई जगहों पर होते हैं। मैक्रोज़ केवल ऐसे फ़ंक्शन हैं जो S-Expressions लौटाते हैं, इसलिए वे फ़ंक्शन के रूप में रिकर्सिव हो सकते हैं। आपके उदाहरण में let के मामले में यह वास्तव में let* को कैल कर रहा है जो एक अलग फ़ंक्शन है (यह फ़ंक्शन नाम में * ठीक है), हालांकि रिकर्सिव मैक्रोज़ ठीक हैं, लेकिन यह उनके उदाहरण का उदाहरण नहीं है

+2

स्पष्ट परिपत्र परिभाषा के बारे में प्रश्न नहीं है? – Jeremy

8

यह संभव है क्योंकि कोर.क्लज में defmacro फ़ंक्शन को परिभाषित करने से पहले let पर this location पर एक परिभाषा पहले से ही परिभाषित की गई है (जिसे बाद में फिर से परिभाषित किया जाता है)। मैक्रोज़ केवल सामान्य कार्य हैं और वे वैर हैं जो मेटा डेटा कुंजी :macro मूल्य true के साथ हैं ताकि संकलन समय पर संकलक एक मैक्रो (जो संकलन समय पर निष्पादित हो) के बीच अंतर कर सकता है, इस मेटा कुंजी के बिना कोई नहीं है मैक्रो और फ़ंक्शन के बीच अंतर करने का तरीका क्योंकि मैक्रो स्वयं एक ऐसा फ़ंक्शन है जो एस-एक्सप्रेशन को संसाधित करता है।

+0

आपको यह भी बताया जाता है कि – Zubair

+2

को परिभाषित किया जा रहा है: '(एफएन * चलो [& form & env & decl] (cons' let * decl)) .. .. यह कहां पर निर्भर करता है? यह कार्य को परिभाषित कर रहा है। यह चलो * का उपयोग करता है जो पहले से ही क्लोजर के जावा कोड में परिभाषित किया गया है – Ankur

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

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