Common lisp 做类型说明符的坏处是:number

Common lisp 做类型说明符的坏处是:number,common-lisp,type-declaration,Common Lisp,Type Declaration,number是类型说明符: 但是,我不能将它与declaim一起使用: (defparameter *foo* 0) (declaim (type (number) *FOO*)) => (typep*FOO*”编号)是T 所以我必须使用(或整数浮点) 我错过了什么 谢谢 SBCL1.4.5 是一个 , (数字)不可用 请使用 (声明(类型编号*FOO*)) 相反 PS1。我建议您使用CLHS而不是CLtL2作为参考。 前者基于官方ANSI CL标准,而后者则已过时 PS2。请注意,numb

number
是类型说明符:

但是,我不能将它与
declaim
一起使用:

(defparameter *foo* 0)
(declaim (type (number) *FOO*))
=>

(typep*FOO*”编号)
是T

所以我必须使用
(或整数浮点)

我错过了什么

谢谢

SBCL1.4.5 是一个 ,
(数字)
不可用

请使用

(声明(类型编号*FOO*))
相反

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


PS2。请注意,
number
(或实复数)
,而不是
(或整数浮点)

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

使用通用Lisp HyperSpec,它源自ANSI CL标准:

这是一个很好的例子

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

词汇表上说:

原子类型说明符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))

错误报告的答案:这是一个错误:
(typep 3'(number))
@Ehvince:但ANSI CL标准明确表示这不是一个错误。@Ehvince:标准说这不是Rainer所说的错误。因此,如果SBCL不接受,则SBCL不符合标准。
(declaim (type number *FOO*))
(declaim (type (number) *FOO*))

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