lisp中的分配函数合并两个列表

时间:2017-05-03 04:00:54

标签: lisp common-lisp

我正在尝试在lisp中创建一个函数,它接收两个列表并将它们的值分配到一个新列表中。我需要获取第一个列表的值并应用于第二个列表的每个元素。

例如:

(funcA '("A"  "B"  "C") '("D" "E" "F"))

并返回这样的内容:

((("A" "B" "C") . "D")
 (("A" "B" "C") . "E")
 (("A" "B" "C") . "F"))

问题是:我无法获得car值。

这是我的代码:

(defun funcA (list1 list2)
  (if (null list1)
      nil
      (if (null list2)
          nil
          (cons (cons (cdr list1) (car list2)) 
                (funcA list1 (cdr list2))))))

上面的函数返回我:

((("B" "C") . "D")
 (("B" "C") . "E")
 (("B" "C") . "F"))

3 个答案:

答案 0 :(得分:0)

我没有明白使用函数funcA。但如果你说它应该如下工作:

例如:

(funcA'(" A"" B"" C")'(" D"&# 34; E"" F"))

并返回这样的内容:

<(>(&#34; A&#34;&#34; B&#34;&#34; C&#34;)。&#34; D&#34;)((&#34; A&#34 ;&#34; B&#34;&#34; C&#34;)。&#34; E&#34;)((&#34; A&#34;&#34; B&#34;&#34; C&#34;)。&#34; F&#34;))

您的代码接近解决方案,但您需要删除un lisp过程,如下所示:

CL-USER> (defun funcA (list1 list2)
    (if (null list1 )
        nil
        (if ( null list2)
            nil
        (cons (cons list1 (car list2 )) 
               (funcA list1  (cdr list2))))))

FUNCA

CL-USER> (funcA '("A" "B" "C") '("D" "E" "F"))
((("A" "B" "C") . "D") (("A" "B" "C") . "E") (("A" "B" "C") . "F"))

你可以看到最后一行等于想要的东西

<(>(&#34; A&#34;&#34; B&#34;&#34; C&#34;)。&#34; D&#34;)((&#34; A&#34 ;&#34; B&#34;&#34; C&#34;)。&#34; E&#34;)((&#34; A&#34;&#34; B&#34;&#34; C&#34;)。&#34; F&#34;))

问题出在这个表达式上:

(cons(cons(cdr list1)(car list2))=&gt;应该是(cons(cons list1(car list2))

答案 1 :(得分:0)

为什么不

(defun funcA (list1 list2)
  (mapcar (lambda (el) (cons list1 el)) list2))

答案 2 :(得分:0)

您可以使用循环宏。 &#34;收集&#34;关键字导致循环压缩结果并将其作为列表返回:

(defun funcA (list1 list2)
     (loop for i in list2
        collect (cons list1 i)))

请注意上面代码中list1和list2的位置。

以这种方式调用它:

 (funca '("a" "b" "c") '("d" "e" "f"))

返回:

((("a" "b" "c") . "d") (("a" "b" "c") . "e") (("a" "b" "c") . "f"))