为什么 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 吗?
几个问题...
首先,collect
是 loop
宏(或工具,如果您愿意)的一部分,因此在 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))))
我无法弄清楚为什么以下功能不起作用。我试图使它 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 吗?
几个问题...
首先,collect
是 loop
宏(或工具,如果您愿意)的一部分,因此在 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))))