我无法弄清楚为什么以下功能不起作用。我想让它返回显示所有组合的列表列表:((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
编辑:为了回答答案,我尝试将循环宏与collect一起使用。 Collect在以下循环中不起作用:
(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吗?
答案 0 :(得分:3)
一些问题......
首先,collect
是loop
宏(或设施,如果您愿意)的一部分,因此在dolist
中使用时会导致问题。
其次,即使collect '(e1 e2)
收集某些东西,它(可能)也不会是您想要的,因为它最终会得到像((e1 e2) (e1 e2) (e1 e2) (e1 e2) (e1 e2) (e1 e2))
这样的列表。
你(可能)想要的是:
(defun cross-product (list1 list2)
(loop for element1 in list1
nconc (loop for element2 in list2
collect (list element1 element2))))