Я хочу использовать макрос binding, но хочу, чтобы он был последовательным, как в let.
binding
let
Полагаю, могу написать так ...
(binding [a 1] (binding [b (inc a)] (println b)))
... но должен быть лучший способ. Есть мысли?
(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])))