number
是类型说明符:CLtl2 4.1 Type Specifier Symbols
但是,我不能将其与declaim
一起使用:
(defparameter *foo* 0)
(declaim (type (number) *FOO*))
=>
bad thing to be a type specifier: (NUMBER)
[Condition of type SIMPLE-ERROR]
(typep *FOO* 'number)
是T。
所以我必须使用(or integer float)
吗?
我想念什么?
谢谢
SBCL1.4.5
答案 0 :(得分:7)
CLtL2对于Common Lisp不具有权威性。 CLtL2描述了ANSI标准化之前的一种语言。
使用Common Lisp HyperSpec,它是从ANSI CL标准CLHS 4.2.3 Type Specifiers派生的。
可以写为列表的类型说明符带有辅助类型信息称为复合类型说明符,而某些则是仅复合类型说明符
词汇表中的内容
原子类型说明符是原子的类型说明符。对于每个原子类型说明符x,都有一个等效的化合物类型说明符,没有提供参数(x)。
这将表明(number)
是有效的类型说明符。一些实现接受它:LispWorks,ABCL,GCL,...
由于该词汇表是标准的一部分,因此可能是SBCL,CLISP,Clozure CL,...的错误和/或遗漏。
然后使用这种类型说明符是合法的:
(declaim (type number *FOO*))
(declaim (type (number) *FOO*))
(typep *FOO* 'number)
(typep *FOO* '(number))
答案 1 :(得分:4)
symbol
number
是
type specifier,
list (number)
是不是。
请使用
(declaim (type number *FOO*))
相反。
PS1 。我建议您使用CLHS而不是CLtL2作为参考。 前者基于官方ANSI CL标准,而后者已过时。
PS2 。请注意,number
是(or real complex)
,而不是(or integer float)
。