gpt4 book ai didi

结构布局 : can't make a constructor to set the field I need

转载 作者:太空宇宙 更新时间:2023-11-03 18:43:51 25 4
gpt4 key购买 nike

下面的代码可以“编译”,但不能正常运行:

(defstruct (image-info
(:conc-name img-)
(:constructor %make-img-info (&key file))
(:print-function print-img-info))
(file nil :type string)
(gd-image nil :type (or cl-gd::image null))
(size '(0 . 0) :type cons)
(position '(0 . 0) :type cons))

(defun print-img-info (info stream level)
(declare (ignore level))
(let ((size (img-size info))
(pos (img-position info)))
(format stream "~s[width: ~d, height: ~d, x: ~d, y: ~d]"
(img-file info)
(car size) (cdr size) (car pos) (cdr pos))))

(defun make-img-info (path)
(let ((image (cl-gd:create-image-from-file path))
(info (%make-img-info :file path))) ; <--- problem here
(setf (img-gd-image info) image
(img-size info)
(cons (cl-gd:image-width image)
(cl-gd:image-height image))) info))

SBCL 正确地推断出 %make-img-info 的参数类型,如下所示:

(describe '%make-img-info)
SPRITESHEET::%MAKE-IMG-INFO
[symbol]

%MAKE-IMG-INFO names a compiled function:
Lambda-list: (&KEY (FILE NIL))
Declared type: (FUNCTION (&KEY (:FILE STRING))
(VALUES IMAGE-INFO &OPTIONAL))

但是当我尝试编译 make-img-info 时,我得到了这个:

  note: deleting unreachable code
warning:
Derived type of PATH is
(VALUES CL-GD::IMAGE &OPTIONAL),
conflicting with its asserted type
STRING.

我将正确的参数(一个字符串)传递给这个函数,但它仍然无法调用它,因为它“相信”它必须是 cl-gd:image。我怀疑问题是布局在某种程度上是按字母顺序排列的,并且 gd-image 出现在列表中的 file 之前......但是我该如何解决这个问题?我真的不想重命名字段?

最佳答案

现在我认为这是与 SLIME 和 SBCL 在编译结构时不能很好地合作有关的某种故障。我无法始终如一地重现此行为,但其他结构偶尔也会发生这种情况,因此有时我需要杀死 SLIME 和 SWANK,重新启动 SBCL 并重新编译,因为仅重新编译结构的相关部分将不起作用。

我不会删除这个问题,因为如果有人会遇到类似的行为,也许它会有助于重新启动 Lisp,所以这种经验会很有用。

关于结构布局 : can't make a constructor to set the field I need,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14083618/

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