我无法弄清楚为什么下面的函数不工作。我试图让它返回列表显示了所有组合的列表:((1 5) (1 6) (1 7) (2 5) (2 6) (2 7) (3 5) (3 6) (3 7))
为什么收集函数在这个Lisp代码中不起作用
(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。收集总是需要nconc?
'COLLECT'不是一个函数。它是'LOOP'宏的一部分,因此只能在'LOOP'中使用。 – jkiiski
重新编辑:内部循环中的COLLECT会创建子列表,因此您需要外部循环来将子句加入到单个列表中。另外,你不应该在那里有那些'DO'。 'DO'不是'FOR ... IN ...'构造的一部分,而是一个用于执行表单的独立语句(比如'COLLECT'和'NCONC',除了'DO'丢弃结果外)。 – jkiiski
[Lisp:如何从列表中包含的列表中获取所有可能的元素组合?](http://stackoverflow.com/questions/18675913/lisp-how-to-get-all-possible-combinations包含元素的列表) – anquegi