2011-07-15 34 views

Odpowiedz

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, ale czy masz pojęcie, dlaczego powiązanie nie zostało w ten sposób zaimplementowane w pierwszej kolejności? – mikera

+1

+1 także. Dobra ilustracja tego, jak makra mogą korygować ograniczenia języka. –

+1

@mikera Może dlatego, że 'binding' zmienia zmienne vars, więc musi martwić się bardziej o bezpieczeństwo wątków? Tylko domysły, naprawdę nie mam pojęcia. –

Powiązane problemy