开发者

Is there a way to do sequential bindings in Clojure?

开发者 https://www.devze.com 2023-03-20 10:52 出处:网络
I want to use the binding macro, but want it to be sequential like in let. I guess I can write it like this...

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])))
0

精彩评论

暂无评论...
验证码 换一张
取 消