Common Lisp:将多个值连接成向量

Sig*_*erm 4 common-lisp

我需要一个将多个值连接到(简单)向量中的函数,类似于(concatenate )。但是,与串联不同,它应该能够处理不是向量或序列的参数。

即它应该像这样工作:

(concat #(1 2) 3) => #(1 2 3)
(concat 1 2 3) => #(1 2 3)
(concat 1 #(2 3 4)) => #(1 2 3 4)
(concat #(1 2) 2 #(3 4 5)) => #(1 2 3 4 5)
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?我想我忘记了一些琐碎的lisp构造,使之成为可能。

据我所知,串联无法做到。而且我不太确定如何将它与宏配合使用(有,@将列表插入最终的Lisp形式的构造,但是在这种情况下,我不确定如何区分非序列和序列)。

sds*_*sds 5

reduce其他答复中的方法在时间上是二次方的。

这是一个线性解决方案:

(defun my-concatenate (type &rest args)
  (apply #'concatenate type
         (mapcar (lambda (a) (if (typep a 'sequence) a (list a)))
                 args)))
Run Code Online (Sandbox Code Playgroud)