【发布时间】:2016-07-11 16:28:07
【问题描述】:
我无法弄清楚为什么以下功能不起作用。我试图让它返回一个显示所有组合的列表列表:((1 5) (1 6) (1 7) (2 5) (2 6) (2 7) (3 5) (3 6) (3 7))
(defun combo3 (list1 list2)
(dolist (e1 list1)
(dolist (e2 list2)
collect '(e1 e2))))
> (combo3 '(1 2 3) '( 5 6 7) )
NIL
编辑:作为对答案的回应,我尝试将循环宏与收集一起使用。收集在以下循环中不起作用:
(defun combo4 (list1 list2)
(loop for element1 in list1 do
(loop for element2 in list2 do
collect (list element1 element2))))
> (combo4 '(1 2 3) '( 5 6 7) )
NIL
我试图让它在没有 nconc 的情况下工作。 collect 总是需要 nconc 吗?
【问题讨论】:
-
COLLECT不是函数。它是LOOP-macro 的一部分,因此只能在LOOP中使用。 -
重新编辑:内部循环中的
COLLECT创建子列表,因此您需要外部循环有一个子句将它们连接到一个列表中。此外,您不应该在那里拥有那些DOs。DO不是FOR ... IN ...构造的一部分,而是用于执行表单的单独语句(如COLLECT和NCONC,除了DO丢弃结果)。
标签: lisp common-lisp