gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 19:05:10 25 4
gpt4 key购买 nike

我有一堆常量,我希望它们的类型为 (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)。它甚至是 类型(或 string null (integer 0 277))。那么,当您询问(type-of 1)时,答案应该是什么?

Lisp 实现知道一些内置类型。它们通常会返回它们知道包含该值的类型中最受限制的类型。如果您的 Lisp 实现对以 5 为基数的数字进行了特殊处理,则它可能会返回 2 的 (integer 0 5) (或其别名)。

这就是 CLHS 的原因表示它返回a类型说明符,而不是类型。它还指定它必须返回一些合理的内容(看看那里)。

您的声明是关于名为 +c0+常量,但是 type-of 调用看不到该常量,它只看到由此产生的值(value)(考虑评估步骤)。因此该声明在这里不起作用。

如果您想动态限制值的类型,可以使用 thecheck-type .

关于common-lisp - 如何指定常量的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65152424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com