我有一堆常量,我想成为类型(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为底的数字进行特殊处理,则它可能会返回2 (integer 0 5)
(或该数字的别名)。
所以这就是为什么CLHS说,它返回一个类型说明符,而不是该类型。它还指定必须返回明智的内容(在此处查看)。
你的声明与名为的常量有关+c0+
,但是type-of
调用没有看到该常量,它仅看到从中得出的值(请考虑评估步骤)。因此,断言在这里不起作用。
如果你想即时限制值的类型,可以使用the
或check-type
。