[英]Clojure: understaning the binding in a doseq
我了解以下代码片段及其相应的输出
(let [ [x y] (map list [1 2] [3 4])] (prn x) (prn y))
(1 3)
(2 4)
nil
现在,以下输出使我感到困惑:
(doseq [ [x y] (map list [1 2] [3 4])] (prn x y))
1 3
2 4
nil
我认为在上述代码段中,x将绑定到[1 3],y将绑定到[2 4],因此输出应为“
1 2
3 4
nil
绑定将嵌套中较大的单个元素内的单个元素拉出。 地图创建一个列表((1 3) (2 4)
使元件1 3
是第一,因此这正是doseq输出:这是“解构”和x
和y
均由的单个元件内结合因此x和y分别是1和3,然后是2和4。
还要注意,这与for
中发生的绑定相同for
并且解构适用于所有序列类型。
让我们隔离您的困惑的根源。
(map list [1 2] [3 4])
评估为
((1 3) (2 4))
所以你的第一个例子
(let [[x y] (map list [1 2] [3 4])] (prn x) (prn y))
...相当于
(let [[x y] [[1 3] [2 4]]] (prn x) (prn y))
...或者,打印略有不同
(let [[x y] [[1 3] [2 4]]] (prn [x y]))
...简化为
(let [z [[1 3] [2 4]]] (prn z))
...如预期的那样生产
; [[1 3] [2 4]]
; nil
到现在为止还挺好。
如果我们把这个令人困惑的例子简单化,
(doseq [ [x y] (map list [1 2] [3 4])] (prn x y))
...以相同的方式,我们获得了将每个z
整体打印的自由,
(doseq [z [[1 3] [2 4]]] (prn z))
可以清楚地产生观察到的顺序:
[1 3]
[2 4]
nil
区别在于, doseq
将[ z
doseq
绑定到[[1 3] [2 4]]
每个连续矢量,因此我们看不到封闭的[ ... ]
,而let
将z
一次绑定到整个事物。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.