Loops 在Common Lisp中使用循环宏的嵌套循环
我试图在CL中实现一个基本的嵌套循环,但循环宏拒绝了这一点。基本上,我希望找到所有可能的3位数产品,并将它们累积到一个列表中 以下是我的尝试:Loops 在Common Lisp中使用循环宏的嵌套循环,loops,macros,nested,lisp,common-lisp,Loops,Macros,Nested,Lisp,Common Lisp,我试图在CL中实现一个基本的嵌套循环,但循环宏拒绝了这一点。基本上,我希望找到所有可能的3位数产品,并将它们累积到一个列表中 以下是我的尝试: (loop for x downfrom 999 to 998 do (loop for y downfrom 999 to 998 collect (* x y))) 由于某种原因,上面的代码返回NIL。顺便说一句,我知道我只运行到998,但这是为了测试目的 我可以做些什么来获得这样的列表: (999*999*998…998*998 998*997
(loop for x downfrom 999 to 998 do (loop for y downfrom 999 to 998 collect (* x y)))
由于某种原因,上面的代码返回NIL
。顺便说一句,我知道我只运行到998,但这是为了测试目的
我可以做些什么来获得这样的列表:
(999*999*998…998*998 998*997…997*997 997*996…100*100)
内部循环中的
COLLECT
-子句不会影响外部循环。因此,内部循环返回一个结果列表,但外部循环中的DO
-子句只是丢弃结果。您应该使用APPEND
或ncoc
而不是DO
。如果没有性能问题,通常最好只使用APPEND
,即使在这种情况下ncoc
是安全的
(loop for x downfrom 999 to 900
append (loop for y downfrom 999 to 900
collect (* x y)))
魔术非常感谢!我仍然习惯于阅读CL的文档,它们有时会让人困惑。@Mad物理学家w.r.t.CLHS循环页面,这是一种温和的轻描淡写,不是吗@意志是的,温和的哈哈:-)Peter Seibel概述了LOOP: