我正在尝试在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"))
答案 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"))