Ehv*_*nce 3 common-lisp type-declaration
number
是类型说明符:CLtl2 4.1类型说明符符号
但是,我不能将其用于declaim
:
(defparameter *foo* 0)
(declaim (type (number) *FOO*))
Run Code Online (Sandbox Code Playgroud)
=>
bad thing to be a type specifier: (NUMBER)
[Condition of type SIMPLE-ERROR]
Run Code Online (Sandbox Code Playgroud)
(typep *FOO* 'number)
是T。
所以我必须用(or integer float)
?
我想念什么?
谢谢
SBCL1.4.5
CLtL2不是Common Lisp的权威。CLtL2描述了ANSI标准化之前的语言。
使用从ANSI CL标准派生的Common Lisp HyperSpec:CLHS 4.2.3类型说明符。
可以写为带有辅助类型信息的列表的类型说明符称为复合类型说明符,有些是仅复合类型说明符。
词汇表中说:
原子类型说明符 是原子的类型说明符。对于每个原子类型说明符x,都有一个等效的化合物类型说明符,不提供任何参数(x)。
这将表明这(number)
是一个有效的类型说明符。一些实现接受它:LispWorks,ABCL,GCL,...
由于该词汇表是标准的一部分,因此可能是SBCL,CLISP,Clozure CL等的错误和/或遗漏。
那么这种类型说明符的使用是合法的:
(declaim (type number *FOO*))
(declaim (type (number) *FOO*))
(typep *FOO* 'number)
(typep *FOO* '(number))
Run Code Online (Sandbox Code Playgroud)