在Lisp中组合2个列表

在Lisp中组合2个列表,lisp,Lisp,从2个简单的列表,例如1 2 3和a b c,我试图创建一个列表1 a 2 b 3 c的列表。但是,以下代码不起作用: (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::%E

从2个简单的列表,例如1 2 3和a b c,我试图创建一个列表1 a 2 b 3 c的列表。但是,以下代码不起作用:

(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表达式吗?

您不需要嵌套循环,只需要一个循环同时在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)))
您需要反转结果列表,因为推送将以与原始列表相反的顺序创建结果列表

您还可以使用LOOP的内置COLLECT操作符

如果需要两个列表中元素的所有组合,嵌套循环将起作用。只需使用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))

嵌套循环将产生该结果。你只需要修正DO语法。我希望它们是1 3 2 4。当到达较短列表的末尾时,循环结束。代码的格式仍然不正确。请努力格式化您的代码。我建议您花点时间阅读一篇基本的Lisp简介,而不是创建大量琐碎的语法错误,比如在格式糟糕的代码中放错括号。这里有一个很好的例子:
(defun comblist (list1 list2) 
  (let ((combl '()))
    (loop for i in list1
      do
        (loop for j in list2
          do
            (push (list i j) combl)))
    combl))