Warm tip: This article is reproduced from serverfault.com, please click

common lisp-如何指定常量的类型?

(common lisp - how to specify type for a constant?)

发布于 2020-12-05 00:10:15

我有一堆常量,我想成为类型(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+)

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

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

Questioner
BitTickler
Viewed
11
Svante 2020-12-05 21:57:23

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调用没有看到该常量,它仅看到从中得出的值(请考虑评估步骤)。因此,断言在这里不起作用。

如果你想即时限制值的类型,可以使用thecheck-type