在公共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 (

我将自己的任务设置为编写一个公共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 ((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
,因为它不会被修改。