2011-07-15 12 views
5

मैं binding मैक्रो का उपयोग करना चाहता हूं, लेकिन यह let में अनुक्रमिक होना चाहता है।क्लोजर में अनुक्रमिक बाइंडिंग करने का कोई तरीका है?

मुझे लगता है कि मैं इसे इस तरह लिख सकते हैं ...

 
(binding [a 1] 
    (binding [b (inc a)] 
    (println b))) 

... लेकिन वहाँ होगा एक बेहतर तरीका हो सकता है। कोई विचार?

उत्तर

8
(defmacro binding* [bindings & body] 
    (reduce (fn [acc [x y]] 
      `(binding [~x ~y] ~acc)) 
      `(do [email protected]) 
      (reverse (partition 2 bindings)))) 

user> (declare ^:dynamic a ^:dynamic b) 
#'user/b 
user> (binding* [a 1 b (inc a)] [a b]) 
[1 2] 

user> (macroexpand-1 '(binding* [a 1 b (inc a)] [a b])) 
(clojure.core/binding [a 1] 
(clojure.core/binding [b (inc a)] 
    (do [a b]))) 
+0

+1, हालांकि आपको कोई विचार है कि क्यों बाध्यकारी पहले उदाहरण में इस तरह लागू नहीं किया गया था? – mikera

+1

+1 भी। मैक्रोज़ भाषा की सीमाओं को कैसे सही कर सकता है इसका एक अच्छा उदाहरण। –

+1

@ मिकरा शायद क्योंकि 'बाइंडिंग' वर्र्स बदल रहा है, इसलिए इसे थ्रेड सुरक्षा के बारे में और चिंता करनी है? बस एक अनुमान, वास्तव में कोई विचार नहीं है। –

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

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