gpt4 book ai didi

clojure - defn 与 let 关于分解的比较

转载 作者:行者123 更新时间:2023-12-02 14:40:48 25 4
gpt4 key购买 nike

我定义了一个函数,它接受两个参数 - 映射和一个键。 key引用自map参数分解

(defn myfunc [{v k} k]
v)

当我打电话时:

  (myfunc {:a 10} :a)

令人惊讶的是,它产生了预期结果:10

let 中的类似内容:

(let [{v k} {:a 10} k :a] v)

失败,因为在评估第一部分时,目前尚未定义k

我的问题是:为什么函数参数内部的分解与 let 表达式中的分解表现不同?

最佳答案

宏观扩展defn我得到了与此相同的形式(删除了 .withMeta 内容并重新格式化):

(def myfunc
(fn* myfunc
([p__11393 k]
(let* [map__11394 p__11393
map__11394 (if (seq? map__11394)
(apply hash-map map__11394)
map__11394)
v (get map__11394 k)]
v))))

所以在这里我们可以看到 {v k} map 实际上首先被分配给局部变量 p__11393 。然后是if语句测试该变量是否实际上是一个序列,如果是,则将其转换为 HashMap ,否则保持原样。重要的是,分配给 k 的值在所有这些发生之后在 map 中查找,因此这可以正常工作(如果:a不在 map 中,get在这种情况下返回nil) .

另一方面,宏扩展 let我得到的表格

(let*
[map__11431
{:a 10}
map__11431
(if (seq? map__11431) (apply hash-map map__11431) map__11431)
v
(get map__11431 k)
k
:a]
v)

在这里我们可以看到v得到结果 (get map__11431 k) ,但是k此时尚未定义,因此会出现错误。

关于clojure - defn 与 let 关于分解的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7796809/

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