首页 > 解决方案 > 如何指定常量的类型?

问题描述

我有一堆常量,我想成为 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-lispsbcl

解决方案


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调用没有看到该常量,它只看到来自它的值(考虑评估步骤)。因此,这种声明在这里不会产生影响。

如果要动态限制值的类型,可以使用theor check-type


推荐阅读