我需要一个将多个值连接到(简单)向量中的函数,类似于(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形式的构造,但是在这种情况下,我不确定如何区分非序列和序列)。
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)