Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法在Clojure中进行顺序绑定?_Clojure - Fatal编程技术网

有没有办法在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])))