Types 整数向量不是数字数组的子类型,为什么?

Types 整数向量不是数字数组的子类型,为什么?,types,lisp,common-lisp,sbcl,Types,Lisp,Common Lisp,Sbcl,我们有以下几点: CL-USER> (subtypep 'integer 'number) T T CL-USER> (subtypep 'double-float 'number) T T CL-USER> (subtypep 'vector 'array) T T 因此: CL-USER> (subtypep '(vector integer) '(array number)) T T 但我不明白: CL-USER> (subtypep '(vector

我们有以下几点:

CL-USER> (subtypep 'integer 'number)
T
T

CL-USER> (subtypep 'double-float 'number)
T
T

CL-USER> (subtypep 'vector 'array)
T
T
因此:

CL-USER> (subtypep '(vector integer) '(array number))
T
T
但我不明白:

CL-USER> (subtypep '(vector double-float) '(array number))
NIL
T
我使用的是SBCL 1.3.1.debian x86_64,以防这依赖于实现。谢谢大家!

是否
(数组foo)
(数组条)
的子类型取决于实现在内存中是否有
foo
bar
类型的值数组的压缩表示。如果实现对其中一种元素类型具有更紧凑的表示(例如,为了避免内存表示中的间接级别),则数组类型不兼容,因此
subsubip
返回false。如果实现使用相同的压缩表示或泛型表示,则
subfile
返回true

特别是,函数
(lambda(foo-bar)(subscriptp`(array,foo)`(array,bar))
的行为取决于实现

例如,
(数组整数)
是SBCL和CLISP中的
(数组编号)
的子类型,但不在GCL中。
(数组双浮点)
是CLISP中的
(数组编号)
的子类型,但不在GCL或SBCL中

这在。

中指定自:

所以,

 (subtypep '(array T1) '(array T2)) =>  true 
当且仅当

(upgraded-array-element-type 'T1)  and  
(upgraded-array-element-type 'T2)
返回始终引用相同对象集的两个不同类型说明符

以下是SBCL 1.3.7的回报:

CL-USER> (upgraded-array-element-type 'double-float)
DOUBLE-FLOAT
CL-USER> (upgraded-array-element-type 'number)
T
我猜想,如果我们尝试添加整数或复数,则专用于双浮点的数组可能无法正常工作。规范没有要求实现保证在这种情况下子类型关系保持不变


这与:

作为源和汇的可变数据类型应该是不变的。 猫不能被当作动物来对待。把狗放进动物身上应该是可能的