Common Lisp中使用循环宏进行嵌套循环

3

我正在尝试在CL中实现基本的嵌套循环,但是Loop宏程序却阻止了这一点。基本上,我想找到所有三位数字的可能乘积,并将它们累加到一个列表中。

以下是我的尝试:

 (loop for x downfrom 999 to 998 do (loop for y downfrom 999 to 998 collect (* x y)))

上面的代码由于某些原因返回了NIL。顺便说一下,我意识到我只运行到998,但这是为了测试目的而做的。
我该怎么做才能获得像这样的列表:
(999*999 999*998 ... 998*998 998*997 ... 997*997 997*996 ... 100*100)

1
Peter Seibel概述了LOOP:http://www.gigamonkeys.com/book/loop-for-black-belts.html - Rainer Joswig
1个回答

11

内层循环中的COLLECT子句不会影响外层循环。因此,内层循环返回一个结果列表,但外层循环中的DO子句会丢弃该结果。你应该使用APPENDNCONC代替DO。通常情况下,如果没有性能问题,最好仅使用APPEND,即使在这种情况下NCONC也是安全的。

(loop for x downfrom 999 to 900
      append (loop for y downfrom 999 to 900
                   collect (* x y)))

魔法!非常感谢! - MadPhysicist
我仍在逐渐习惯阅读CL的文档,有时候它们会让人感到困惑。 - MadPhysicist
4
关于CLHS LOOP页面,@MadPhysicist所说的是一个“温和”的低估,不是吗? :) - Will Ness
@WillNess 是的,是一个温和的笑话 :-) - MadPhysicist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接