gpt4 book ai didi

通过列表或序列上的数字索引进行 Clojure 关联解构 : Unexpected result

转载 作者:行者123 更新时间:2023-12-02 14:32:44 24 4
gpt4 key购买 nike

Clojure 的 Associative Destructuring允许通过数字索引解构一个向量(也可能是seq列表)。

到目前为止,clojure.org 中尚未提及此模式,但The Joy of Clojure,第二版中提到过。迈克尔·福格斯 (Michael Fogus)、克里斯·豪瑟 (Chris Houser),2014 年 5 月,第 12 页59. 这种方法出现在名为“关联解构”的部分中 - 错误的是,这种基于索引的解构只是“关联解构”的一个特例,在该书中,它被称为“使用映射解构”。

无论如何,结果是出乎意料的(Clojure 1.10.0):

在所有情况下,提取索引 0 和 3 处的值。

这些按预期工作:

(let [{firstthing 0, lastthing 3} [1 2 3 4]] [firstthing lastthing])
;=> [1 4]

(let [{firstthing 0, lastthing 3} (vec '(1 2 3 4))] [firstthing lastthing])
;=> [1 4]

但在列表中:

(let [{firstthing 0, lastthing 3} '(1 2 3 4)] [firstthing lastthing])
;=> [nil 4]

为什么位置0处有nil

同样:

(let [{firstthing 0, lastthing 3} (seq '(1 2 3 4))] [firstthing lastthing])
;=> [nil 4]

但另一方面:

(let [{firstthing 0, lastthing 3} (vec (seq '(1 2 3 4)))] [firstthing lastthing])
;=> [1 4]

这是怎么回事?

附录:

(let [{firstthing 0, lastthing 3} { 1 2 3 4 } ] [firstthing lastthing])
;=> [nil 4]

...听起来很合理,因为要关联破坏的映射实际上是 {1 2, 3 4}。因此,不是通过位置而是通过整数键(可以这么说,改变我们脚下表达式的含义)查找的结果将恰好是[无 4]。是否有任何不是向量的东西先倒入 map ?

(let [{firstthing 10, lastthing 30} (seq '(10 2 30 4))] [firstthing lastthing])
;=> [2 4]

看起来确实是这样......

(let [{firstthing 10, lastthing 30} (seq '(10 2 30 ))] [firstthing lastthing])
; Execution error (IllegalArgumentException) at user/eval367 (REPL:1).
; No value supplied for key: 30

哦,是的。

最佳答案

Why is there nil at position 0?

(let [{firstthing 0, lastthing 3} '(1 2 3 4)] [firstthing lastthing])
;=> [nil 4]

如果您查看该 let 生成的代码:

user=> (macroexpand '(let [{firstthing 0, lastthing 3} '(1 2 3 4)] [firstthing lastthing]))
(let*
[map__8012 (quote (1 2 3 4))
map__8012 (if (clojure.core/seq? map__8012)
(clojure.lang.PersistentHashMap/create (clojure.core/seq map__8012))
map__8012)
firstthing (clojure.core/get map__8012 0)
lastthing (clojure.core/get map__8012 3)]
[firstthing lastthing])

你看,如果是 seq? 它将被转换为 map 。所以:

user=> (def map__8012 (quote (1 2 3 4)))
#'user/map__8012
user=> (clojure.core/seq? map__8012)
true
user=> (clojure.lang.PersistentHashMap/create (clojure.core/seq map__8012))
{1 2, 3 4}

因此,对于键0,您会得到nil,对于键3,您会得到4

关于通过列表或序列上的数字索引进行 Clojure 关联解构 : Unexpected result,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55894136/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com