anchor.diff:  (in-package #:first-class-lambda-lists)
   
   (defclass parameter () ())
  +
  +(defgeneric unparse (object))
  +
  +(defmethod print-object ((parameter parameter) stream)
  +  (print-unreadable-object (parameter stream :type t)
  +    (prin1 (unparse parameter) stream)))
   
   (defclass parameter-variable-mixin ()
     ((%variable :initarg :variable
  
positive.code:   (check-type parameter symbol)
    (make-instance 'required-parameter :variable parameter))
  
  (defclass specializable-parameter (required-parameter)
    ((%specializer :initarg :specializer
                   :reader specializer
                   :initform nil)))
  
  (defun %parse-specializable-parameter (parameter)
    (multiple-value-bind (variable specializer)
        (if (symbolp parameter)
            (values parameter nil)
            (destructuring-bind (variable &optional specializer)
                parameter
              (values variable specializer)))
      (make-instance 'specializable-parameter
                     :variable variable
                     :specializer specializer)))
  
  (defclass optional-parameter (parameter parameter-variable-mixin parameter-initform-mixin parameter-suppliedp-variable-mixin)
    ())
  
  
negative.code:                    :initform initform
                     :suppliedp-variable suppliedp-variable)))
  
  (defmethod unparse ((parameter optional-parameter))
    (let ((variable (variable parameter))
          (initform (initform parameter))
          (suppliedp-variable (suppliedp-variable parameter)))
      (if (or initform suppliedp-variable)
          `(,variable ,initform ,@(when suppliedp-variable (list suppliedp-variable)))
          variable)))
  
  (defclass optional-no-defaulting-parameter (parameter parameter-variable-mixin)
    ())
  
  (defun %parse-optional-no-defaulting-parameter (parameter)
  