在公共Lisp中连接两个列表
我将自己的任务设置为编写一个公共Lisp函数,该函数连接两个列表,而不使用在公共Lisp中连接两个列表,lisp,common-lisp,Lisp,Common Lisp,我将自己的任务设置为编写一个公共Lisp函数,该函数连接两个列表,而不使用append 公共Lisp输入(concat list'(1 2 3)'(4 5 6))应返回(1 2 3 4 5 6) 尽管我的解决方案似乎有效,但它显然非常复杂 (defun concat-lists(seq1 seq2) (cond ((not (null seq1)) (cons (car seq1) (concat-lists (cdr seq1) seq2))) (T (cond (
append
公共Lisp输入(concat list'(1 2 3)'(4 5 6))
应返回(1 2 3 4 5 6)
尽管我的解决方案似乎有效,但它显然非常复杂
(defun concat-lists(seq1 seq2)
(cond ((not (null seq1)) (cons (car seq1) (concat-lists (cdr seq1) seq2)))
(T (cond ((not (null seq2)) (cons (car seq2) (concat-lists seq1 (cdr seq2))))
(T nil)))))
我所寻找的是一个更优雅的解决方案,使用reduce
,其中我使用seq1
作为初始值,然后对seq2
的每个元素应用一个函数,从而将列表的每个值附加到seq1
。不知怎的,我总是在尝试时被卡住
非常感谢您的任何帮助或意见。谢谢 Rainer Joswig的解决方案非常优雅简单,并且尊重您使用
reduce
的要求
CL-USER 39 > (reduce #'cons
'(1 2 3 4 5)
:initial-value '(a b c d e)
:from-end t)
(1 2 3 4 5 A B C D E)
如果您还想看到一个递归的简单解决方案,那么下面是一个经典的解决方案:
(defun concat-lists (seq1 seq2)
(if (null seq1)
seq2
(cons (car seq1) (concat-lists (cdr seq1) seq2))))
(concat-lists '(1 2 3) '(4 5 6))
(1 2 3 4 5 6)
我确实理解你对“减少”的要求。还有其他选择: CL还有“concatenante”
(连接'list'(1 2 3)'(4 5 6))
还有另一个不那么复杂(IMHO),也没有那么优雅
(取消目录列表(列表1列表2)
(让((a(副本列表1))
(b(副本清单2)))
(rplacd(最后a)b)
a) )
或
(取消目录列表(列表1列表2)
(让((a(副本列表1))
(b(副本清单2)))
(ncoc a b))
两个函数中都不需要复制list2
,因为它不会被修改。