繁体   English   中英

Clojure:了解剂量中的结合

[英]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输出:这是“解构”和xy 均由单个元件内结合因此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]]每个连续矢量,因此我们看不到封闭的[ ... ] ,而letz一次绑定到整个事物。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM