3

以下のコードは「コンパイル」されますが、正しく機能しません。

(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-imagefileに表示されることだと思います...しかし、どうすればこれに対処できますか? フィールドの名前を本当に変更したくないのですか?

4

1 に答える 1

0

これは、構造体をコンパイルするときに SLIME と SBCL がうまく連携しないことに関連する、ある種のグリッチだと思います。この動作を一貫して再現することはできませんが、他の構造体でも時々発生するため、SLIME と SWANK を強制終了し、SBCL を再起動して再コンパイルする必要があります。これは、構造体の関連部分のみを再コンパイルすると機能しないためです。

誰かが同様の動作に遭遇した場合、Lisp を再起動すると役立つ可能性があるため、質問を削除するつもりはありません。したがって、この経験は役立つ可能性があります。

于 2012-12-31T07:49:50.563 に答える