anchor.diff:  
   ;; Define other geometric products
   
  -(defmacro defgp (name efn ofn nofn doc)
  +(defmacro defgp (name euclid-fn orth-fn nonorth-fn doc)
     "Define derived geometric product given Euclidean, orthogonal, and non-orthogonal functions."
     `(defmethod ,name ((g1 g) (g2 g))
        ,doc
        (typecase (metric g1)
  -       (null (,efn g1 g2))
  -       (vector (,ofn g1 g2 (metric g1)))
  -       (metric (,nofn g1 g2 (metric g1))))))
  +       (null (,euclid-fn g1 g2))
  +       (vector (,orth-fn g1 g2 (metric g1)))
  +       (metric (,nonorth-fn g1 g2 (metric g1))))))
   
   (defgpe *g2e *gbe "Geometric product with Euclidean metric")
   (defgpo *g2o *gbo "Geometric product with orthogonal metric")
  
positive.code:   (+ (* (unitg b) (- (sin (/ a 2))))
       (cos (/ a 2))))
  
  ;; Test functions
  (defmethod zerogp ((g g))
    "Test if GA object is zero"
    (null (grade g)))
  
negative.code: 
  ;; Outer product
  
  (defgpe *o2 *ob "Outer product of 2 GA objects (Euclidean, orthogonal, & non-orthogonal spaces)")
  (defun *o (&rest args) "Outer product of GA objects (all spaces)" (reduce #'*o2 args))
  (defmethod *o3 ((g1 g)(g2 g)(g3 g)) "Outer product of 3 GA objects (all spaces)" (*o g1 g2 g3))
  
  ;; Non-orthogonal products
  
  