Есть ли способ сделать последовательные привязки в Clojure? - PullRequest
5 голосов
/ 15 июля 2011

Я хочу использовать макрос binding, но хочу, чтобы он был последовательным, как в let.

Полагаю, могу написать так ...

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

... но должен быть лучший способ. Есть мысли?

1 Ответ

8 голосов
/ 15 июля 2011
(defmacro binding* [bindings & body]
  (reduce (fn [acc [x y]]
            `(binding [~x ~y] ~acc))
          `(do ~@body)
          (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])))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...