common-lisp - 如何指定常量的类型?
问题描述
我有一堆常量,我想成为 type (unsigned-byte 8)
。
(declaim (type '(unsigned-byte 8) +c0+ +c1+))
(defconstant +c0+ #x0)
(defconstant +c1+ #x10)
但是声明似乎并没有起到作用,因为当我键入(type-of +c0+)
它返回BIT
(或整数,取决于值)时,这显然不是我想要的。
那么,如何指定常量的类型呢?
更新
事实证明,这个问题 - 虽然仍然是一个问题 - 并不是我的问题的根本原因。在(make-array '(2) ...
导致“不兼容类型”错误的部分中,我输入了initial-contents
一个引用列表,我应该在其中放置一个“列出”列表。错误:'(+c0+ +c1+)
,正确:(list +c0+ +c1+)
。
鉴于我仍然在脑海中将变量而不是值与类型相关联,我无法解释由此产生的错误消息的含义。
所以,如果系统允许我,基本上我会删除这个问题。
解决方案
Common Lisp 中的类型实际上只是一组值。任何值都可以是无数种类型。
例如,数字 1 属于类型bit
(它是 的别名(integer 0 1)
)。它也是类型(integer 0 2)
,或(integer -47 234)
。它甚至是类型(or string null (integer 0 277))
。那么,当你问的时候(type-of 1)
,答案应该是什么?
Lisp 实现知道一些内置的类型。它们通常会返回他们知道包含该值的那些类型中最受限制的类型。如果你的 Lisp 实现对以 5 为底的数字进行了特殊处理,它可能会返回(integer 0 5)
(或它的别名)为 2。
所以这就是为什么CLHS说它返回一个类型说明符,而不是类型。它还指定它必须返回一些合理的东西(看看那里)。
您的声明是关于名为的常量+c0+
,但type-of
调用没有看到该常量,它只看到来自它的值(考虑评估步骤)。因此,这种声明在这里不会产生影响。
如果要动态限制值的类型,可以使用the
or check-type
。
推荐阅读
- javascript - IF条件不显示模态
- html - 可以在 HTML 中显示图像,但不能在 Django 中显示?将静态文件设置为 Windows 目录?
- javascript - JavaScript Array.push() 跨多个(嵌套)数组复制
- android - 找不到表情符号兼容字体提供程序
- reactjs - React-redux `useSelector` 抱怨 Hook 调用无效
- python - 一些 pygame 模块不工作
- python - Locust - 你可以即时更改任务权重吗?
- java - 如何在同一个自定义注释接口内访问自定义注释中的变量?
- python - 带有命令问题的下拉菜单
- windows - 字典问题: