连接Common Lisp中的两个列表

law*_*313 3 lisp common-lisp

我将自己设置为编写Common Lisp函数的任务,该函数将两个列表连接在一起而不使用append

通用Lisp输入(concat-lists '(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)))))
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种更优雅的解决方案reduce,该方法使用将我 seq1用作初始值的位置,然后将函数应用于的每个元素seq2,从而将列表的每个值附加到seq1。尝试时总会卡住我...

任何帮助或投入,我们将不胜感激。谢谢!

Rai*_*wig 5

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)
Run Code Online (Sandbox Code Playgroud)


Ren*_*nzo 5

Rainer Joswig 的解决方案非常优雅和简单,并且尊重您使用reduce.

如果您还想查看递归的简单解决方案,那么这里是经典的解决方案:

(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)
Run Code Online (Sandbox Code Playgroud)