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
我猜想,如果我们尝试添加整数或复数,则专用于双浮点的数组可能无法正常工作。规范没有要求实现保证在这种情况下子类型关系保持不变
这与: 作为源和汇的可变数据类型应该是不变的。 猫不能被当作动物来对待。把狗放进动物身上应该是可能的