gpt4 book ai didi

clojure - 为什么 let 不是一个有效的重复目标?

转载 作者:行者123 更新时间:2023-12-04 12:09:00 24 4
gpt4 key购买 nike

在 clojure 中,这是有效的:

(loop [a 5]
(if (= a 0)
"done"
(recur (dec a))))

然而,这不是:
(let [a 5]
(if (= a 0)
"done"
(recur (dec a))))

所以我想知道:为什么循环和让分开,因为它们都(至少在概念上)引入了词法绑定(bind)?也就是说,为什么 loop 是循环目标,而 let 不是?

编辑:最初写的“循环目标”我注意到是不正确的。

最佳答案

考虑以下示例:

(defn pascal-step [v n]
(if (pos? n)
(let [l (concat v [0])
r (cons 0 v)]
(recur (map + l r) (dec n)))
v))

该函数计算 n+m给定 m 的帕斯卡三角形的第 行第行。

现在,想象一下, letrecur目标。在这种情况下,我将无法递归调用 pascal-step函数本身来自 let使用 recur 绑定(bind)运算符(operator)。

现在让我们让这个例子更复杂一点:
(defn pascal-line [n]
(loop [v [1]
i n]
(if (pos? i)
(let [l (concat v [0])
r (cons 0 v)]
(recur (map + l r) (dec i)))
v)))

现在我们正在计算 n帕斯卡三角形的第 条线。如您所见,我需要两个 looplet这里。

这个例子很简单,所以你可以建议删除 let使用 (concat v [0]) 绑定(bind)和 (cons 0 v)直接,但我只是向你展示这个概念。可能有更复杂的示例,其中 letloop 内是不可避免的。

关于clojure - 为什么 let 不是一个有效的重复目标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19178779/

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