anchor.diff:  ;;   (write-value 'ascii &key length)))
   ;;
   
  +;;; TODO: gensym, and lexcical binding for user defined body.
   (defmacro define-binary-accessor (type args &body body)
     (ecase (length body)
       (1 `(progn (defmethod read-value ((type (eql ',type)) stream &key ,@args)
  
positive.code:               (find-all-slots (car (get parent :parent))))))
  
  (defmacro define-binary-class (name (&rest super-class) slot)
    `(progn
       (eval-when (:compile-toplevel :load-toplevel :execute)
         (setf (get ',name :slots) ',(mapcar #'car slot))
         (setf (get ',name :parent) ',super-class))
  
       (defclass ,name ,super-class
         ,(mapcar #'slot->class-slot slot))
  
       (defmethod read-object progn ((object ,name) stream)
                  (with-slots ,(mapcar #'first slot) object
                    (progn
                      ,@(mapcar #'(lambda (x) (slot->read-value x 'stream)) slot))))
  
       (defmethod write-object progn ((object ,name) stream)
                  (with-slots ,(mapcar #'first slot) object
                    (progn
                      ,@(mapcar #'(lambda (x) (slot->write-value x 'stream)) slot))))))
  
  ;; binary class accessor
  ;;(define-binary-accessor ascii (length)
  
negative.code:     (let* ((type-and-arg-list (mklist type-and-arg))
             (type (car type-and-arg-list))
             (args (cdr type-and-arg-list)))
        `(setf (,slot-name ,object) (read-value ',type ,object ,@args)))))
  
  (defun slot->write-value (slot object stream)
    (destructuring-bind (slot-name type-and-arg) slot
      (let* ((type-and-arg-list (mklist type-and-arg))
             (type (car type-and-arg-list))
             (args (cdr type-and-arg-list)))
        `(write-value ',type (,slot-name ,object) ,stream ,@args))))
  
  (defgeneric read-value (type stream &key)
    (:documentation "read value for type object from stream"))
  