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)