anchor.diff:  (in-package |aminopy|)
   
  +(defmacro def-attr-accessor (((object type) attr) &body body)
  +  `(defmethod clpython::attr-hook ((,object ,type) (attr (eql ',(intern (string attr)
  +                                                                        :clpython.user))))
  +     ,@body))
  +
  +(defmacro def-subs-accessors (type &body things)
  +  (with-gensyms (object name)
  +    `(progn (defmethod clpython:py-subs ((,object ,type) ,name)
  +              (cond ,@(loop for (key function) in things
  +                         collect `((string= ,name ,key)
  +                                   (,function ,object)))))
  +            ,@(loop for (key function) in things
  +                   collect
  +                   `(def-attr-accessor ((,object ,type) ,key)
  +                      (,function ,object))))))
   
   ;;;;;;;;;;;;;;;;
   ;; Transforms ;;
  
positive.code: (defmethod clpython:py-subs ((x amino::real-array) (item #+clpython-fixnum-is-a-class fixnum #-clpython-fixnum-is-a-class integer)) ;; tuple
    (aref (amino::real-array-data x) item))
  
  ;;;;;;;;;;;;;;;;;;
  ;; Scene Graphs ;;
  ;;;;;;;;;;;;;;;;;;
  
negative.code:     rotation(tf2(1, [1,2,3])) =>
          #S(AMINO:QUATERNION :DATA #(0.0d0 0.0d0 0.0d0 1.0d0))
  
      tf2(1, [1,2,3]).rotation =>
          #S(AMINO:QUATERNION :DATA #(0.0d0 0.0d0 0.0d0 1.0d0))
  
  "
    (rotation transform))
  
  