Common lisp 如何为常数指定类型?

Common lisp 如何为常数指定类型?,common-lisp,sbcl,Common Lisp,Sbcl,我有一组常量,我希望它的类型是(无符号字节8) 但是这个声明似乎没有起作用,因为当我输入(type of+c0+时,它返回位(或整数,取决于值),这显然不是我想要的 那么,如何指定常量的类型呢 更新 事实证明,这个问题——尽管仍然是个问题——并不是我问题的根源。在导致“不兼容类型”错误的(make array'(2).部分,我为初始内容输入了一个带引号的列表,我应该在其中放置一个“列出的”列表。错误:(+c0++c1+),右:(list+c0++c1+) 考虑到我仍然将变量而不是值与类型联系在一

我有一组常量,我希望它的类型是
(无符号字节8)

但是这个声明似乎没有起作用,因为当我输入
(type of+c0+
时,它返回
位(或整数,取决于值),这显然不是我想要的

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

更新 事实证明,这个问题——尽管仍然是个问题——并不是我问题的根源。在导致“不兼容类型”错误的
(make array'(2).
部分,我为
初始内容
输入了一个带引号的列表,我应该在其中放置一个“列出的”列表。错误:
(+c0++c1+)
,右:
(list+c0++c1+)

考虑到我仍然将变量而不是值与类型联系在一起,我无法解释由此产生的错误消息的含义

因此,如果系统允许,我基本上会删除这个问题。

(类型为+c0+)
不返回变量或常量的声明类型。它返回对象的动态类型,即
+c0+
的值

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


但是您需要理解使用DECLAIM、DECLARE等的静态类型声明与动态类型(如type-OF、type-p、MAKE-ARRAY的元素类型选项中使用的类型)之间的区别,Common Lisp中的类型实际上只是一组值。任何值都可以有无限多个类型

例如,数字1的类型是
(它是
(整数0 1)
)的别名。它也是
(整数0 2)
,或
(整数-47 234)
。它甚至是
(或字符串null(整数0 277))类型的。因此,当你问
(整数0 2)
,答案应该是什么

Lisp实现知道一些内置类型。它们通常会返回它们知道包含值的那些类型中最受限制的类型。如果您的Lisp实现对基数为5的数字进行了特殊处理,则它可能会返回2的
(整数0 5)
(或其别名)

这就是为什么说它返回一个类型说明符,而不是类型。它还指定它必须返回一些有意义的东西(看看那里)

您的声明是关于名为
+c0+
的常量的,但是
类型的
调用没有看到该常量,它只看到从中产生的值(考虑计算步骤)。因此声明在这里不会起作用


如果要动态限制值的类型,可以使用or。

因此答案是“我不能”?当我尝试使用这些常量值初始化数组时,会收到错误消息,表明常量的类型与数组元素的类型不兼容:
(make array'(2):元素类型(无符号字节8):初始内容(list+c0++c1+)
这最终是我的目标。@BitTicker:您需要编辑您的问题以添加到其中。讨论有语法问题(您的类型没有被引用)且内容中没有实际错误消息的代码段是没有用的。
(declaim (type '(unsigned-byte 8) +c0+ +c1+))
(defconstant +c0+ #x0)
(defconstant +c1+ #x10)