anchor.diff:  (defun getter-name (choice-name slot-name)
     (alexandria:symbolicate 'get- choice-name '- slot-name))
   
  +
  +(defun generate-choice-encoder (name class tag alternatives)
  +  `(defun ,(encoder-name name) (stream choice) (encode-choice ',alternatives stream choice)))
  +
  +(defun generate-choice-decoder (name class tag alternatives)
  +  `(defun ,(decoder-name name) (stream)
  +
  +
  +     (decode-choice ',alternatives stream)
  +
  +     ))
  +
  +
   (defmacro defchoice (name (&optional class tag) &rest alternatives)
     (unless (valid-alternatives-p alternatives)
       (error "Duplicate choices in the alternatives for ~A:~%~{   ~S~%~}" name alternatives))
  
positive.code:                                  (,(accessor-name name '%alternative) choice)
                                   ',alternative-keyword ',reader)
                           (,(accessor-name name '%value) choice))
                         ;; alternative writer: (setf (object-integer choice) 42) ; updates the %alternative too.
                         (defun (setf ,reader) (new-value choice)
                           (setf (,(accessor-name name '%alternative) choice) ',alternative-keyword
                                 (,(accessor-name name '%value)       choice) new-value))
                         )))
                   alternatives)
         (defun ,(getter-name name 'alternative) (choice) (,(accessor-name name '%alternative) choice))
         (defun ,(getter-name name 'value)       (choice) (,(accessor-name name '%value)       choice))
         (defun ,(encoder-name name) (stream choice) (encode-choice ',alternatives stream choice))
         (defun ,(decoder-name name) (stream)        (decode-choice ',alternatives stream)))))
  
  
  ;; -----------------------------------
  
negative.code:                    (let ((alternative-keyword (alexandria:make-keyword (cadr alternative)))
                           (reader              (accessor-name name (car alternative))))
                       `(
                         ;; public constructor for alternative: (make-object-integer 42)
                         (defun ,(constructor-name name (car alternative)) (value)
                           (,%constructor ',alternative-keyword value))
                         ;; public reader for alternative: (object-integer choice) -> 42 or error.
                         (defun ,reader (choice)
                           (assert (eq ',alternative-keyword (,(accessor-name name '%alternative) choice))
                                   (choice)
  