最后一个循环关键字

Gol*_*den 3 lisp common-lisp

当我问如何为乐透获取数字时,我被赋予了提示来创建一个混合列表的函数.所以我试着这样做,我甚至让它工作了.

我目前的实现如下:

(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?而且,实际导致此问题的代码有什么问题?

有没有更好的方法来制定这个?

Rai*_*wig 6

警告: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是更好的参考.