lisp中的强制功能-数组和列表

Pau*_*ulM 1 lisp common-lisp coerce clozure-cl

我看到不同版本的Common Lisp之间有不同的强制行为-想知道哪个是“正确的”或在这个看似简单的问题上是标准的模棱两可:

(coerce '(1 2 3) 'array) 
Run Code Online (Sandbox Code Playgroud)

正确的口吻?它在Clozure Common Lisp中工作正常,但在sbcl中却不能。

当不起作用时,将列表强制转换为数组的最简单方法是什么?

谢谢

Bar*_*mar 7

规范说:

如果result-type是的可识别子类型vector,并且object是a sequence,则结果是a且vector具有与object相同的元素。

array不是vector向量的子类型-向量是一维数组,但array包括任意维数的数组。

您可以使用其中之一

(coerce '(1 2 3) 'vector)
(coerce '(1 2 3) '(array t (*)))
Run Code Online (Sandbox Code Playgroud)

在第二个版本中,(*)指定一个未指定尺寸的尺寸。

您的使用是不确定的,因此实现可以随意实现。如果它返回一个值,则该值必须是ARRAY某种类型的。