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

Wis*_*son 3 lisp arrays concatenation common-lisp

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

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

Fré*_*idi 6

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

(concatenate '(vector (unsigned-byte 8)) array-A array-B)
Run Code Online (Sandbox Code Playgroud)

请注意,文档说:

如果result-type是vector的子类型,那么如果实现可以确定为result-type指定的元素类型,则生成的数组的元素类型是升级该元素类型的结果.

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


Sam*_*ard 5

您可以尝试执行类似这样的操作来返回与第一个数组相同类型的数组:

(concatenate (type-of array-A) array-A array-B)
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不会很好,因为类型可能包括数组的长度,并且您可能需要更长的数组.

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

(concatenate `(vector ,(array-element-type array-A)) array-A array-B)
Run Code Online (Sandbox Code Playgroud)

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