anchor.diff:  
   (defun rat-numerator (rat)
     "The numerator of a rational expression."
  -  (typecase rat
  +  (etypecase rat
       (rat (rat-numer rat))
  -    (number (numerator rat))
  -    (t rat)))
  +    (number (numerator rat))))
   
   (defun rat-denominator (rat)
     "The denominator of a rational expression."
  -  (typecase rat
  +  (etypecase rat
       (rat (rat-denom rat))
  -    (number (denominator rat))
  -    (t 1)))
  +    (number (denominator rat))))
   
   (defun rat*rat (x y)
     "Multiply rationals: a/b * c/d = a*c/b*d"
  
positive.code:          (setf poly (poly*poly poly p)))))))
  
  (defun poly/ (&rest args)
    "Polynomial multiplication where (/ P) returns (/ 1 P) as with
  CL::/ for numbers."
    (case (length args)
      (1 (poly/poly 1 (first args)))
  
negative.code:        (- (* (- x 1) (+ x 1)) (- (^ x 2) 1)) => 0"
    (cond ((numberp x) x)
          ((var-p x) (poly x 0 1))
          ((exp-p x)
           (apply (get-fn (expr-op x))
                  (mapcar #'prefix->canon (exp-args x))))
          (t (error "Not a polynomial: ~a" x))))
  