Я читал книгу Питера Сейбеля Practical Common Lisp, собирая проект из кода книги, доступного в Интернете. в том порядке, в котором он указан в книге, и до сих пор у меня есть файл, который компилирует и загружает код каждой главы по очереди, и именно здесь я столкнулся с проблемами: когда я пока загружаю FASL для проекта, я получаю предупреждения в разделе ID3v2, подобные приведенному ниже.
Я не понимаю, где возникает конфликт номеров аргументов. UNSIGNED-INTEGER
, похоже, получает два аргумента ключевого слова. Также мне кажется, что макрос 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)))))