有没有办法在Clojure中进行顺序绑定?
我想使用有没有办法在Clojure中进行顺序绑定?,clojure,Clojure,我想使用绑定宏,但希望它像let中那样顺序 我想我可以这样写 (binding [a 1] (binding [b (inc a)] (println b))) (具有约束力[a 1] (具有约束力[b(inc a)] (b) ……但总有更好的办法。有什么想法吗?+1,不过你知道为什么绑定在一开始没有以这种方式实现吗?+1。这是宏如何纠正语言限制的一个很好的例子。@mikera可能是因为绑定正在改变变量,所以它必须更加担心线程安全?只是一个猜测,真的不知道。我写了一个我删除的回复,因
绑定
宏,但希望它像let
中那样顺序
我想我可以这样写
(binding [a 1]
(binding [b (inc a)]
(println b)))
(具有约束力[a 1]
(具有约束力[b(inc a)]
(b)
……但总有更好的办法。有什么想法吗?+1,不过你知道为什么绑定在一开始没有以这种方式实现吗?+1。这是宏如何纠正语言限制的一个很好的例子。@mikera可能是因为
绑定正在改变变量,所以它必须更加担心线程安全?只是一个猜测,真的不知道。我写了一个我删除的回复,因为考虑到封面下发生的事情,我越想,我越觉得请求的行为是奇怪的。绑定
函数基本上只是散列映射
构造函数的包装器,考虑到该构造函数不是以这种方式工作的,后面的值通过键引用前面的值,我怀疑库作者甚至不认为需要这种行为是有意义的。不管怎样,我自己来自Common Lisp,在那里,let*
会起到作用,我仍然很同情。
(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])))