Is there a way to do sequential bindings in Clojure?
I want to use the binding
macro, but want it to be sequential like in let
.
I guess I can write it like this...
(binding [a 1] (binding开发者_如何学运维 [b (inc a)] (println b)))
...but there's gotta be a better way. Any thoughts?
(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])))
精彩评论