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

Car*_*sma 3 lisp types sbcl common-lisp

我们有以下内容:

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

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

CL-USER> (subtypep 'vector 'array)
T
T
Run Code Online (Sandbox Code Playgroud)

所以这个:

CL-USER> (subtypep '(vector integer) '(array number))
T
T
Run Code Online (Sandbox Code Playgroud)

但我不明白这个:

CL-USER> (subtypep '(vector double-float) '(array number))
NIL
T
Run Code Online (Sandbox Code Playgroud)

我正在使用SBCL 1.3.1.debian x86_64,以防这是依赖于实现的.谢谢!

Gil*_*il' 6

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

特别是,函数的行为(lambda (foo bar) (subtypep `(array ,foo) `(array ,bar))依赖于实现.

例如,(array integer)(array number)SBCL和CLISP中的子类型,但不是GCL中的子类型.(array double-float)(array number)CLISP中的子类型,但不是GCL或SBCL中的子类型.

这在Common Lisp定义中指定.