从2个简单列表(例如(1 2 3)和(a b c))我试图创建列表列表((1a)(2b)(3c))。但是,以下代码无效:
(defun comblist_op (list1 list2)
(let ((combl '()))
(loop for i in list1 do(
loop for j in list2 do(
(push (list i j) combl))))
combl))
错误是:
*** - SYSTEM::%EXPAND-FORM: (PUSH (LIST I J) COMBL) should be a lambda expression
我需要在这里写lambda表达式吗?
答案 0 :(得分:2)
您不需要嵌套循环,只需一个循环同时迭代list
和list2
。嵌套循环将构成交叉产品,而不仅仅是组合相应的元素。
您获得的错误是因为您在do
之后的表达式周围添加了一组额外的括号。它并不要求你把它们包起来。
(defun comblist (list1 list2)
(let ((combl '()))
(loop for i in list1
for j in list2
do (push (list i j) combl))
(nreverse combl)))
您需要撤消结果列表,因为PUSH
将以与原始列表相反的顺序创建它。
您还可以使用COLLECT
的内置LOOP
运算符。
(defun comblist (list1 list2)
(loop for i in list1
for j in list2
collect (list i j)))
如果您想要两个列表中元素的所有组合,嵌套循环将起作用。只需使用DO
表达式周围的额外括号修复问题。
(defun comblist (list1 list2)
(let ((combl '()))
(loop for i in list1
do
(loop for j in list2
do
(push (list i j) combl)))
combl))