如何连接简单数组并在Common Lisp中保留元素类型'(unsigned-bytes 8)?

时间:2014-05-13 13:43:30

标签: arrays lisp concatenation common-lisp

我有两个简单数组,其中元素类型是'(无符号字节8)。如果我使用(concatenate 'vector array-A array-B),结果数组的元素类型将不再是#(无符号字节8)。

如何连接数组并将其元素类型保存在Lisp中?

2 个答案:

答案 0 :(得分:6)

正如Rainer Joswig在评论中指出的那样,你可以简单地指定结果向量的元素类型:

(concatenate '(vector (unsigned-byte 8)) array-A array-B)

请注意documentation说:

  

如果 result-type 是vector的子类型,那么如果执行   可以确定为结果类型指定的元素类型   结果数组的元素类型是升级的结果   元素类型。

因此,您的LISP实施可以自由选择更好的"结果向量的元素类型(例如,如果指定类似(unsigned-byte 5)的内容,则可能会发生这种情况)。

答案 1 :(得分:5)

你可以尝试做类似这样的事情来返回与第一个数组相同类型的数组:

(concatenate (type-of array-A) array-A array-B)

不幸的是,这不会很好用,因为类型可能包含数组的长度,你可能需要更长的数组。

如果你愿意失去一点普遍性,你可以选择:

(concatenate `(vector ,(array-element-type array-A)) array-A array-B)

这将返回一个与array-A具有相同元素类型的向量,无论可能是什么。