在Lisp中组合2个列表

时间:2016-07-09 03:17:22

标签: lisp

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

1 个答案:

答案 0 :(得分:2)

您不需要嵌套循环,只需一个循环同时迭代listlist2。嵌套循环将构成交叉产品,而不仅仅是组合相应的元素。

您获得的错误是因为您在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))