gpt4 book ai didi

clojure - 在循环中使用 recur 时出现 "Can only recur from tail position, compiling"错误

转载 作者:行者123 更新时间:2023-12-05 08:43:32 32 4
gpt4 key购买 nike

我是 Clojure 的新手,为了练习,我尝试对半随机数应用一个简单的算法。

几天前,我在 clojure 的文档中读到循环,以及它们如何使用 recur 工作,所以我尝试用这行代码编写一个循环:

(def numbers_semi_random
(fn []
(loop[Xn 4 count 0]
(while (and (not (= Xn m)) (< count m))
(println (mod (+ (* 5.0 Xn) 7.0) m))
(recur (mod (+ (* 5.0 Xn) 7.0) m) (inc count))
))))

但是当我执行代码时,会显示这个错误

CompilerException java.lang.UnsupportedOperationException: Can only recur from tail position, compiling

这是怎么回事? recur 不是在函数的尾部吗?

最佳答案

您的意图似乎可以通过使用 when 代替 while 来实现(然后您的循环将继续打印 Xn 的更新值> 直到满足条件),但要解释异常:

从编译器的角度来看,问题在于虽然 while 形式确实位于相对于您的 loop 的尾部位置,但 while 宏的扩展使得 while 的主体中没有任何内容位于 while 形式的尾部位置。 (如果正文处于尾部位置 w.r.t. while 形式,它也将处于尾部位置 w.r.t. 封闭的 loop。)

之所以如此,是因为 while 扩展为一个 loop 表达式,并在用户提供的正文之后提供了它自己的 recur:

(while test
body...)

;; expands to

(loop []
(when test
body...
(recur)))

因此,如果您提供一个 recur 作为 while 主体的一部分,您得到的是

(loop []
(when test
...
(recur ...) ; from user code
(recur)))

此处用户提供的 (recur ...) 相对于其立即封闭的 loop 不在尾部位置,这就是编译器所提示的。

关于clojure - 在循环中使用 recur 时出现 "Can only recur from tail position, compiling"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28511825/

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