成为类型说明符很不好:数字

时间:2019-11-05 15:58:38

标签: common-lisp type-declaration

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

2 个答案:

答案 0 :(得分:7)

CLtL2对于Common Lisp不具有权威性。 CLtL2描述了ANSI标准化之前的一种语言。

使用Common Lisp HyperSpec,它是从ANSI CL标准CLHS 4.2.3 Type Specifiers派生的。

NUMBERatomic type specifier

可以写为列表的

类型说明符带有辅助类型信息称为复合类型说明符,而某些则是仅复合类型说明符

词汇表中的内容

  原子类型说明符是原子的类型说明符。对于每个原子类型说明符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 specifierlist (number)不是

请使用

(declaim (type number *FOO*))

相反。

PS1 。我建议您使用CLHS而不是CLtL2作为参考。 前者基于官方ANSI CL标准,而后者已过时。

PS2 。请注意,number(or real complex),而不是(or integer float)