【问题标题】:loop keyword immediately after finally在 finally 之后立即循环关键字
【发布时间】:2014-06-08 19:36:53
【问题描述】:

当我询问如何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)

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

警告:LOOP:紧跟在 FINALLY 之后的循环关键字:CLtL2 允许,ANSI CL 禁止。

很遗憾,我不明白。为什么它告诉我loop 立即出现在finally 之后?而且,导致这种情况的代码有什么问题?

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

【问题讨论】:

  • 请记住,正如所写的那样,这个函数最终会导致您的彩票号码分布相当不均匀。

标签: lisp common-lisp


【解决方案1】:

警告:LOOP:紧跟在 FINALLY 之后的循环关键字:CLtL2 允许,ANSI CL 禁止。

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

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

(loop ...
      finally (return list))

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    相关资源
    最近更新 更多