为什么 collect 函数在此 Lisp 代码中不起作用

Why collect function does not work in this Lisp code

我无法弄清楚为什么以下功能不起作用。我试图使它 return 显示所有组合的列表列表:((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 吗?

几个问题...

首先,collectloop 宏(或工具,如果您愿意)的一部分,因此在 dolist.[=16= 中使用时会导致问题]

其次,即使 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))))