2

私は Peter Seibel の本Practical Common Lispを読んでいて、オンラインで入手できる本のコードから、本に登場する順序でプロジェクトをつなぎ合わせています。これまでのところ、各章のコードを順番にコンパイルしてロードするファイルがあります。ここで問題が発生しました。プロジェクトの FASL をロードすると、ID3v2 セクションで次のような警告が表示されます。

引数番号の競合が発生する場所がわかりません。 UNSIGNED-INTEGER2 つのキーワード引数を取得しているようです。また、マクロは/DEFINE-BINARY-TYPEを使用して任意の数の引数を受け入れるように思えます。何かヒントやアドバイスがあればと思いました。関連する出力とコードを以下に示します。ありとあらゆる助けをいただければ幸いです。&rest&body

前もって感謝します、

; file: .../cl-playlist/id3v2.lisp
; in: DEFINE-BINARY-TYPE U1
;     (BINARY-DATA:DEFINE-BINARY-TYPE ID3V2::U1
;         NIL
;       (ID3V2::UNSIGNED-INTEGER :BYTES 1 :BITS-PER-BYTE 8))
; ...
; ==>
;   (BINARY-DATA:READ-VALUE 'ID3V2::UNSIGNED-INTEGER #:STREAM :BYTES 1
;                           :BITS-PER-BYTE 8)
; 
; caught STYLE-WARNING:
;   The function was called with six arguments, but wants exactly two.

「id3v2.lisp」の問題のある関数は次のようになります。

(define-binary-type u1 () (unsigned-integer :bytes 1 :bits-per-byte 8))

使用して

(define-binary-type unsigned-integer (bytes bits-per-byte)
  (:reader (in)
       (loop with value = 0
          for low-bit 
          downfrom (* bits-per-byte (1- bytes)) to 0 by bits-per-byte do
        (setf (ldb (byte bits-per-byte low-bit) value) (read-byte in))
          finally (return value)))
  (:writer (out value)
       (loop for low-bit 
          downfrom (* bits-per-byte (1- bytes)) to 0 by bits-per-byte
          do (write-byte (ldb (byte bits-per-byte low-bit) value) out))))

「binary-data.lisp」の以下から

(defmacro define-binary-type (name (&rest args) &body spec)
; (defmacro define-binary-type (name &rest args &body spec)
  (with-gensyms (type stream value)
  `(progn
    (defmethod read-value ((,type (eql ',name)) ,stream &key ,@args)
      (declare (ignorable ,@args))
      ,(type-reader-body spec stream))
    (defmethod write-value ((,type (eql ',name)) ,stream ,value &key ,@args)
      (declare (ignorable ,@args))
      ,(type-writer-body spec stream value)))))
4

1 に答える 1