Skip to content

define-binary-type forms need to be evaluated earlier to ensure that their effects can be seen by subsequent forms #1

Description

@slyrus

currently, when one has a define-binary-type form with slots, the :key args provided by those slots are not seen by the compiler as being available to subsequent forms, causing warnings such as this:

(define-binary-type box-list (limit)
  (:reader (in)
           (read-boxes in limit (current-binary-object)))
  (:writer (out value)
           (write-boxes out value)))

(define-binary-class full-container-bbox (full-bbox-header)
  ((children (box-list :limit (data-size (current-binary-object))))))


; file: /Users/sly/projects/iso-media/iso-media.lisp
; in: DEFINE-BINARY-CLASS FULL-CONTAINER-BBOX
;     (COM.GIGAMONKEYS.BINARY-DATA:DEFINE-BINARY-CLASS
;      ISO-MEDIA::FULL-CONTAINER-BBOX (ISO-MEDIA::FULL-BBOX-HEADER)
;      ((ISO-MEDIA:CHILDREN (ISO-MEDIA::BOX-LIST :LIMIT (ISO-MEDIA::DATA-SIZE #)))))
; --> COM.GIGAMONKEYS.BINARY-DATA::DEFINE-GENERIC-BINARY-CLASS PROGN 
; --> DEFMETHOD PROGN EVAL-WHEN SB-PCL::%DEFMETHOD-EXPANDER PROGN 
; --> SB-PCL::LOAD-DEFMETHOD SYMBOL-MACROLET 
; --> SB-PCL::FAST-LEXICAL-METHOD-FUNCTIONS 
; --> SB-PCL::BIND-FAST-LEXICAL-METHOD-FUNCTIONS LOCALLY SB-PCL::BIND-ARGS 
; --> LET* LOCALLY SYMBOL-MACROLET SB-PCL::PV-BINDING SB-PCL::PV-BINDING1 
; --> SB-PCL::PV-ENV LOCALLY LET BLOCK LET SYMBOL-MACROLET 
; --> SB-PCL::OPTIMIZED-SET-SLOT-VALUE LET 
; ==>
;   (COM.GIGAMONKEYS.BINARY-DATA:READ-VALUE 'ISO-MEDIA::BOX-LIST #:STREAMVAR708
;                                           :LIMIT
;                                           (ISO-MEDIA::DATA-SIZE
;                                            (COM.GIGAMONKEYS.BINARY-DATA:CURRENT-BINARY-OBJECT)))
; 
; caught STYLE-WARNING:
;   :LIMIT is not a known argument keyword.

; --> COM.GIGAMONKEYS.BINARY-DATA::DEFINE-GENERIC-BINARY-CLASS PROGN 
; --> DEFMETHOD PROGN EVAL-WHEN SB-PCL::%DEFMETHOD-EXPANDER PROGN 
; --> SB-PCL::LOAD-DEFMETHOD SYMBOL-MACROLET 
; --> SB-PCL::FAST-LEXICAL-METHOD-FUNCTIONS 
; --> SB-PCL::BIND-FAST-LEXICAL-METHOD-FUNCTIONS LOCALLY SB-PCL::BIND-ARGS 
; --> LET* LOCALLY SYMBOL-MACROLET SB-PCL::PV-BINDING SB-PCL::PV-BINDING1 
; --> SB-PCL::PV-ENV LOCALLY LET BLOCK LET SYMBOL-MACROLET 
; ==>
;   (COM.GIGAMONKEYS.BINARY-DATA:WRITE-VALUE 'ISO-MEDIA::BOX-LIST #:STREAMVAR710
;                                            (SB-PCL::OPTIMIZED-SLOT-VALUE
;                                             (SLOT-VALUE #:G746
;                                                         'ISO-MEDIA:CHILDREN)
;                                             #:OBJECTVAR709
;                                             (SB-PCL::INSTANCE-READ
;                                              (SB-PCL::PV-OFFSET 0)
;                                              #:OBJECTVAR709 0
;                                              'ISO-MEDIA:CHILDREN
;                                              'ISO-MEDIA::FULL-CONTAINER-BBOX))
;                                            :LIMIT
;                                            (ISO-MEDIA::DATA-SIZE
;                                             (COM.GIGAMONKEYS.BINARY-DATA:CURRENT-BINARY-OBJECT)))
; 
; caught STYLE-WARNING:
;   :LIMIT is not a known argument keyword.

Changing the progn in the define-binary-type macro to an eval-when fixes the problem:

diff --git a/binary-data.lisp b/binary-data.lisp
index bf0e080..573af15 100644
--- a/binary-data.lisp
+++ b/binary-data.lisp
@@ -36,7 +36,7 @@

 (defmacro define-binary-type (name (&rest args) &body spec)
   (with-gensyms (type stream value)
-  `(progn
+  `(eval-when (:compile-toplevel :load-toplevel :execute)
     (defmethod read-value ((,type (eql ',name)) ,stream &key ,@args)
       (declare (ignorable ,@args))
       ,(type-reader-body spec stream))

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions