为什么收集函数在这个Lisp代码中不起作用

时间:2016-07-11 16:28:08

标签: lisp common-lisp

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

1 个答案:

答案 0 :(得分:3)

一些问题......

首先,collectloop宏(或设施,如果您愿意)的一部分,因此在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))))