anchor.diff:  			   ,(expand-case-clauses (cdr clauses) variable))
   		      (if (not (proper-list-p keys))
   			  (error 'malformed-keys
  +				 :name 'case
   				 :keys keys)
   			  `(if (or ,@(eql-ify keys variable))
   			       (progn ,@forms)
  
positive.code: 	 (multiple-value-bind ,store-vars ,reader-forms
  	   (tagbody
  	      ,label
  	      ,(expand-e/ccase-clauses clauses (car store-vars) final)))))))
  
  ;;; Turn a list of TYPECASE clauses into nested IFs.  We check that
  ;;; the list of clauses is a proper list, that each clause is a proper
  
negative.code: ;;; clause is a proper list.  The default case depends on whether we
  ;;; have a CCTYPECASE or an ETYPECASE, so we pass that as an argument
  ;;; (final).
  (defun expand-e/ctypecase-clauses (clauses variable final name)
    (if (null clauses)
        final
        (if (not (consp clauses))
  	  (error 'malformed-typecase-clauses
  		 :name name
  		 :clauses clauses)
  	  (let ((clause (car clauses)))
  	    (unless (and (proper-list-p clause)
  			 (not (null clause)))
  	      (error 'malformed-typecase-clause
  		     :name name
  		     :clause clause))
  	    (let ((type (car clause))
  		  (forms (cdr clause)))
  	      `(if (typep ,variable ,type)
  		   (progn ,@forms)
  		   ,(expand-e/ctypecase-clauses (cdr clauses) variable final name)))))))
  
  ;;; As with ECASE, the default for ETYPECASE is to signal an error.
  (defmacro etypecase (keyform &rest clauses)
    (let* ((variable (gensym))
  	 (keys (collect-e/ctypecase-keys clauses))
  	 (final `(error 'etypecase-type-error
  			:name 'etypecase
  			:datum ,variable
  			:expected-type '(member ,@keys))))
      `(let ((,variable ,keyform))
         ,(expand-e/ctypecase-clauses clauses variable final 'etypecase))))
  
  ;;; As with CCASE, the default for CTYPECASE is is to signal a
  ;;; correctable error, and to allow the value to be altered by the
  