gpt4 book ai didi

lisp - finally 后立即循环关键字

转载 作者:太空宇宙 更新时间:2023-11-03 18:42:12 24 4
gpt4 key购买 nike

当我问到如何Get numbers for the lottery我得到了创建一个随机列表的函数的提示。所以我尝试这样做,而且我什至让它工作了。

我目前的实现是这样的:

(defun shuffle (list)
(let ((len (length list)))
(loop repeat len
do
(rotatef
(nth (random len) list)
(nth (random len) list))
finally
return list)))

好消息是它有效:

(shuffle '(1 2 3 4 5 6))
;; => (3 1 4 2 6 5)

坏消息是我收到一条错误消息:

WARNING: LOOP: loop keyword immediately after FINALLY: permitted by CLtL2, forbidden by ANSI CL.

可惜我没看懂。为什么它告诉我 loop 立即出现在 finally 之后?而且,实际导致此问题的代码有什么问题?

有没有更好的方法来表达这个?

最佳答案

WARNING: LOOP: loop keyword immediately after FINALLY: permitted by CLtL2, forbidden by ANSI CL.

这意味着RETURN是一个循环关键字,在finally 之后是不允许的, 根据 ANSI CL 标准。

如果我们想从LOOP返回, 我们需要使用 return宏观:

(loop ...
finally (return list))

这实际上是一个常见的错误。 finally return <expr>自 ANSI CL 标准以来不再被允许。这也是不使用 CLtL2(Common Lisp 语言,第 2 版)作为引用的原因。 CL Hyperspec是更好的引用。

关于lisp - finally 后立即循环关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24110064/

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