首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在最后一次之后立即循环关键字

在最后一次之后立即循环关键字
EN

Stack Overflow用户
提问于 2014-06-08 19:36:53
回答 1查看 112关注 0票数 3

当我问到如何使用买彩票的号码时,我得到了创建一个调整列表的函数的提示。所以我试着这么做,我甚至让它起作用了。

我目前的实现如下:

代码语言:javascript
复制
(defun shuffle (list)
  (let ((len (length list)))
    (loop repeat len
      do
        (rotatef
          (nth (random len) list)
          (nth (random len) list))
      finally
        return list)))

好消息是它起作用了:

代码语言:javascript
复制
(shuffle '(1 2 3 4 5 6))
;; => (3 1 4 2 6 5)

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

警告:循环:循环关键字后,最后:允许的CLtL2,禁止的ANSI CL。

不幸的是我不明白。为什么它告诉我loop立即出现在finally之后?那么,导致这种情况的代码有什么问题呢?

是否有更好的方法来表述这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-08 19:50:33

警告:循环:循环关键字后,最后:允许的CLtL2,禁止的ANSI CL。

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

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

代码语言:javascript
复制
(loop ...
      finally (return list))

其实这是个常见的错误。finally return <expr>不再被允许,因为ANSI CL标准。这也是不使用CLtL2 (,第二版)作为参考的原因。CL -超晶石是较好的参考。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24110064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档