如何指定常量的类型?
how to specify type for a constant?
我有一堆常量,我想成为 (unsigned-byte 8)
.
类型
(declaim (type '(unsigned-byte 8) +c0+ +c1+))
(defconstant +c0+ #x0)
(defconstant +c1+ #x10)
但是 declaim 似乎并没有解决问题,因为当我输入 (type-of +c0+)
时给出 returns BIT
(或整数,取决于值),这显然不是我想要什么。
那么,如何指定常量的类型?
更新
事实证明,这个问题 - 虽然仍然是一个问题 - 并不是我遇到问题的根本原因。在导致“不兼容类型”错误的 (make-array '(2) ...
部分中,我为 initial-contents
输入了一个引用列表,我应该在其中放置一个“列出的”列表。错误:'(+c0+ +c1+)
,正确:(list +c0+ +c1+)
.
考虑到我仍然在脑海中将变量而不是值与类型相关联,因此我无法解释由此产生的错误消息的含义。
所以,如果系统允许,我基本上会删除问题。
(type-of +c0+)
不是 return 声明的变量或常量类型。它 return 是对象的动态类型,它是 +c0+
的值。
通过类型声明,您声明了常量标识符的类型。实际上,其效果是特定于实现的。 SBCL 将使用该类型声明。
但您需要了解使用 DECLAIM、DECLARE 等的静态类型声明与动态类型(如 TYPE-OF、TYPE-P、MAKE-ARRAY 的元素类型选项等中使用的类型)之间的区别...
Common Lisp 中的类型实际上只是一组值。任何值都可以是无限多种类型。
例如,数字 1 是 bit
类型(它是 (integer 0 1)
的别名)。它也是 (integer 0 2)
或 (integer -47 234)
类型。它甚至是 (or string null (integer 0 277))
类型。那么,当你问 (type-of 1)
时,答案应该是什么?
Lisp 实现知道某些内置类型。它们通常 return 它们知道包含值的那些类型中最受限制的。如果你的 Lisp 实现对基数 5 的数字有特殊处理,它可能 return (integer 0 5)
(或它的别名)代表 2.
所以这就是为什么 CLHS 说它 returns a 类型说明符,而不是 the 类型.它还指定它必须 return 一些合理的东西(看看那里)。
您的声明是关于名为 +c0+
的 常量 ,但是 type-of
调用看不到该常量,它只看到输出的值它的(考虑评估步骤)。所以宣言不能在这里有效果。
如果您想即时限制值的类型,可以使用 the
or check-type
。
我有一堆常量,我想成为 (unsigned-byte 8)
.
(declaim (type '(unsigned-byte 8) +c0+ +c1+))
(defconstant +c0+ #x0)
(defconstant +c1+ #x10)
但是 declaim 似乎并没有解决问题,因为当我输入 (type-of +c0+)
时给出 returns BIT
(或整数,取决于值),这显然不是我想要什么。
那么,如何指定常量的类型?
更新
事实证明,这个问题 - 虽然仍然是一个问题 - 并不是我遇到问题的根本原因。在导致“不兼容类型”错误的 (make-array '(2) ...
部分中,我为 initial-contents
输入了一个引用列表,我应该在其中放置一个“列出的”列表。错误:'(+c0+ +c1+)
,正确:(list +c0+ +c1+)
.
考虑到我仍然在脑海中将变量而不是值与类型相关联,因此我无法解释由此产生的错误消息的含义。
所以,如果系统允许,我基本上会删除问题。
(type-of +c0+)
不是 return 声明的变量或常量类型。它 return 是对象的动态类型,它是 +c0+
的值。
通过类型声明,您声明了常量标识符的类型。实际上,其效果是特定于实现的。 SBCL 将使用该类型声明。
但您需要了解使用 DECLAIM、DECLARE 等的静态类型声明与动态类型(如 TYPE-OF、TYPE-P、MAKE-ARRAY 的元素类型选项等中使用的类型)之间的区别...
Common Lisp 中的类型实际上只是一组值。任何值都可以是无限多种类型。
例如,数字 1 是 bit
类型(它是 (integer 0 1)
的别名)。它也是 (integer 0 2)
或 (integer -47 234)
类型。它甚至是 (or string null (integer 0 277))
类型。那么,当你问 (type-of 1)
时,答案应该是什么?
Lisp 实现知道某些内置类型。它们通常 return 它们知道包含值的那些类型中最受限制的。如果你的 Lisp 实现对基数 5 的数字有特殊处理,它可能 return (integer 0 5)
(或它的别名)代表 2.
所以这就是为什么 CLHS 说它 returns a 类型说明符,而不是 the 类型.它还指定它必须 return 一些合理的东西(看看那里)。
您的声明是关于名为 +c0+
的 常量 ,但是 type-of
调用看不到该常量,它只看到输出的值它的(考虑评估步骤)。所以宣言不能在这里有效果。
如果您想即时限制值的类型,可以使用 the
or check-type
。