如何指定常量的类型?

how to specify type for a constant?

我有一堆常量,我想成为 (unsigned-byte 8).

类型
(declaim (type '(unsigned-byte 8) +c0+ +c1+))
(defconstant +c0+ #x0)
(defconstant +c1+ #x10)

但是 declaim 似乎并没有解决问题,因为当我输入 (type-of +c0+) 时给出 returns BIT (或整数,取决于值),这显然不是我想要什么。

那么,如何指定常量的类型?

更新 事实证明,这个问题 - 虽然仍然是一个问题 - 并不是我遇到问题的根本原因。在导致“不兼容类型”错误的 (make-array '(2) ... 部分中,我为 initial-contents 输入了一个引用列表,我应该在其中放置一个“列出的”列表。错误:'(+c0+ +c1+),正确:(list +c0+ +c1+).

考虑到我仍然在脑海中将变量而不是值与类型相关联,因此我无法解释由此产生的错误消息的含义。

所以,如果系统允许,我基本上会删除问题。

(type-of +c0+) 不是 return 声明的变量或常量类型。它 return 是对象的动态类型,它是 +c0+ 的值。

通过类型声明,您声明了常量标识符的类型。实际上,其效果是特定于实现的。 SBCL 将使用该类型声明。

但您需要了解使用 DECLAIM、DECLARE 等的静态类型声明与动态类型(如 TYPE-OF、TYPE-P、MAKE-ARRAY 的元素类型选项等中使用的类型)之间的区别...

Common Lisp 中的类型实际上只是一组值。任何值都可以是无限多种类型。

例如,数字 1 是 bit 类型(它是 (integer 0 1) 的别名)。它也是 (integer 0 2)(integer -47 234) 类型。它甚至是 (or string null (integer 0 277)) 类型。那么,当你问 (type-of 1) 时,答案应该是什么?

Lisp 实现知道某些内置类型。它们通常 return 它们知道包含值的那些类型中最受限制的。如果你的 Lisp 实现对基数 5 的数字有特殊处理,它可能 return (integer 0 5) (或它的别名)代表 2.

所以这就是为什么 CLHS 说它 returns a 类型说明符,而不是 the 类型.它还指定它必须 return 一些合理的东西(看看那里)。

您的声明是关于名为 +c0+ 常量 ,但是 type-of 调用看不到该常量,它只看到输出的值它的(考虑评估步骤)。所以宣言不能在这里有效果。

如果您想即时限制值的类型,可以使用 the or check-type