common lisp中的强制函数--数组和列表

common lisp中的强制函数--数组和列表,lisp,common-lisp,coerce,clozure-cl,Lisp,Common Lisp,Coerce,Clozure Cl,我在不同版本的Common Lisp之间看到了不同的强制行为,我想知道哪一个是正确的,或者在这个看似简单的问题上,标准是不明确的: 是 正确的lisp?它在Clozure Common Lisp中运行良好,但在sbcl中则不起作用 当它不起作用时,将列表强制转换为数组的最简单方法是什么 谢谢经理说: 如果结果类型是向量的可识别子类型,并且对象是序列,则结果是与对象具有相同元素的向量 数组不是向量的子类型-向量是一维数组,但数组包含任意维数的数组 你可以用其中一个 (coerce '(1 2 3)

我在不同版本的Common Lisp之间看到了不同的强制行为,我想知道哪一个是正确的,或者在这个看似简单的问题上,标准是不明确的:

正确的lisp?它在Clozure Common Lisp中运行良好,但在sbcl中则不起作用

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

谢谢

经理说:

如果结果类型是向量的可识别子类型,并且对象是序列,则结果是与对象具有相同元素的向量

数组不是向量的子类型-向量是一维数组,但数组包含任意维数的数组

你可以用其中一个

(coerce '(1 2 3) 'vector)
(coerce '(1 2 3) '(array t (*)))
在第二个版本中,*指定一个尺寸未指定的标注

您的使用未指定,因此实现可以随意实现。如果它返回一个值,则该值必须是某种数组。

表示:

如果结果类型是向量的可识别子类型,并且对象是序列,则结果是与对象具有相同元素的向量

数组不是向量的子类型-向量是一维数组,但数组包含任意维数的数组

你可以用其中一个

(coerce '(1 2 3) 'vector)
(coerce '(1 2 3) '(array t (*)))
在第二个版本中,*指定一个尺寸未指定的标注


您的使用未指定,因此实现可以随意实现。如果它返回一个值,则该值必须是某种数组。

要添加到Barmar的答案中,这实际上是一个注释,但它太长了,虽然CCL可以这样做,但我认为很明显,在标准中很难定义类似的内容

考虑一下这样的情况:

(coerce '((1 2 3) (4 5 6) (7 8 9)) 'array)
这意味着什么结果?如果是:

每个元素都是三元素列表的向量? 与make数组'3 3:初始内容'1 2 3 4 5 6 7 8 9的等价物? 那个数组的转置? 我认为前两种解释中的任何一种都是合理的:有时你会想要一种,有时你会想要另一种。第三种可能是不合理的,因为CL是一种主要语言


所以,如果强迫…'数组在标准中,您将如何指定要使用哪一个?如果你只是选择了一个,那应该是哪一个?你现在如何与委员会中认为应该是另一个的人达成一致

对于Barmar的回答,这确实是一个评论,但它太长了,虽然CCL可以这样做,但我认为很明显,在标准中很难定义这样的内容

考虑一下这样的情况:

(coerce '((1 2 3) (4 5 6) (7 8 9)) 'array)
这意味着什么结果?如果是:

每个元素都是三元素列表的向量? 与make数组'3 3:初始内容'1 2 3 4 5 6 7 8 9的等价物? 那个数组的转置? 我认为前两种解释中的任何一种都是合理的:有时你会想要一种,有时你会想要另一种。第三种可能是不合理的,因为CL是一种主要语言


所以,如果强迫…'数组在标准中,您将如何指定要使用哪一个?如果你只是选择了一个,那应该是哪一个?你现在如何与委员会中认为应该是另一个的人达成一致

谢谢,我现在知道怎么做了。但出于好奇-ccl允许我的第一次胁迫是错误的吗?规范是矛盾的吗?规范没有说明什么不应该工作,只有什么应该工作?规范没有说明在其他情况下应该做什么,所以实现可以自由扩展。谢谢,我现在知道如何继续了。但出于好奇-ccl允许我的第一次胁迫是错误的吗?规范是否矛盾?规范没有说明什么不应该工作,只有什么应该工作?规范没有说明在其他情况下应该做什么,所以实现可以自由扩展它。