首页 > 解决方案 > 成为类型说明符的坏事:数字

问题描述

number是类型说明符:CLtl2 4.1 类型说明符符号

但是,我不能将它用于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

标签: common-lisptype-declaration

解决方案


CLtL2 不是 Common Lisp 的权威。CLtL2 描述了 ANSI 标准化之前的语言。

使用 Common Lisp HyperSpec,它源自 ANSI CL 标准:CLHS 4.2.3 Type Specifiers

NUMBER是一个原子类型说明符

可以写成带有辅助类型信息的列表的类型说明符称为复合类型说明符,有些是仅复合类型说明符

词汇表说:

原子类型说明符 n。一个原子的类型说明符。对于每个原子类型说明符 x,都有一个等效的复合类型说明符,没有提供任何参数, (x)。

这将表明这(number)是一个有效的类型说明符。一些实现接受它:LispWorks,ABCL,GCL,...

由于词汇表是标准的一部分,这可能是 SBCL、CLISP、Clozure CL 中的错误和/或遗漏,...

那么这种类型说明符的使用是合法的:

(declaim (type number *FOO*))
(declaim (type (number) *FOO*))

(typep *FOO* 'number)
(typep *FOO* '(number))

推荐阅读