当我问如何为乐透获取数字时,我被赋予了提示来创建一个混合列表的函数.所以我试着这样做,我甚至让它工作了.
我目前的实现如下:
(defun shuffle (list)
(let ((len (length list)))
(loop repeat len
do
(rotatef
(nth (random len) list)
(nth (random len) list))
finally
return list)))
Run Code Online (Sandbox Code Playgroud)
好消息是它有效:
(shuffle '(1 2 3 4 5 6))
;; => (3 1 4 2 6 5)
Run Code Online (Sandbox Code Playgroud)
坏消息是我收到一条错误消息:
警告:LOOP:在FINALLY之后立即循环关键字:CLtL2允许,ANSI CL禁止.
不幸的是我不明白.为什么它告诉我loop后立即出现finally?而且,实际导致此问题的代码有什么问题?
有没有更好的方法来制定这个?
警告:LOOP:在FINALLY之后立即循环关键字:CLtL2允许,ANSI CL禁止.
这意味着它RETURN是一个循环关键字finally,根据ANSI CL标准,之后是不允许的.
如果我们想从中返回LOOP,我们需要使用return宏:
(loop ...
finally (return list))
Run Code Online (Sandbox Code Playgroud)
这实际上是一个常见的错误.finally return <expr>自ANSI CL标准以来不再允许.这也是不使用CLtL2(Common Lisp the Language,2nd Edition)作为参考的原因.该CL Hyperspec是更好的参考.