common-lisp - 成为类型说明符的坏事:数字
问题描述
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
解决方案
CLtL2 不是 Common Lisp 的权威。CLtL2 描述了 ANSI 标准化之前的语言。
使用 Common Lisp HyperSpec,它源自 ANSI CL 标准:CLHS 4.2.3 Type Specifiers。
可以写成带有辅助类型信息的列表的类型说明符称为复合类型说明符,有些是仅复合类型说明符。
词汇表说:
原子类型说明符 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))
推荐阅读
- java - 使用 Spring webflux 和 WebTestClient 获取请求属性
- javascript - “错误:你不能在 reducer 执行时调用 store.getState()。”
- python - 如何将 Polyglot Detector 功能应用于数据帧
- python - 如何根据传递给函数的数据类型调度 Python 2 函数?
- javascript - 无法识别量角器中的 css/xpath 元素
- go - Go 可以用于 BotFramework SDK 还是需要移植?
- ios - UICollectionView.scrollToItem 设置动画速度
- bash - 为什么添加 sqlplus 行会影响 bash 脚本中的回显输出?
- python - App Engine 上的 Flask-SQLAlchemy 使用连接到 Cloud Compute Engine 上的 MSSQL 数据库
- rxjs - 多个rxjs http请求Angular 6