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,以防这是依赖于实现的.谢谢!
是否(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定义中指定.