anchor.diff:    { :__add r+
       :__sub r-
       :__mul r*
  -    :__div r/ })
  +    :__div r/
  +    :__pow rexp
  +    :__lt r<
  +    :__lte r<= })
   
   (defmethod (pretty rational) (x)
     (let* [((xn xd) (normalised-rational-components x))]
  
positive.code: (defmethod (r+ number rational) (x y) (r+ (->rat x) y))
  (defmethod (r+ number number)   (x y) (r+ (->rat x) (->rat y)))
  
  (defgeneric r- (x y) "Subtract rational numbers")
  (defmethod (r- rational rational) (x y)
    (let* [((xn xd) (normalised-rational-components x))
           ((yn yd) (normalised-rational-components y))]
  
negative.code: (defmethod (r* number rational) (x y) (r* (->rat x) y))
  (defmethod (r* number number)   (x y) (r* (->rat x) (->rat y)))
  
  (defgeneric r< (x y) "Less-than relationship between rational numbers")
  (defmethod (r< rational rational) (x y)
    (let* [((xn xd) (normalised-rational-components x))
           ((yn yd) (normalised-rational-components y))]
      (< (* xn yd) (* yn xd))))
  
  (defmethod (r< rational number) (x y) (r< x (->rat y)))
  (defmethod (r< number rational) (x y) (r< (->rat x) y))
  (defmethod (r< number number)   (x y) (r< (->rat x) (->rat y)))
  
  (defgeneric r<= (x y) "Less-than-or-equals relationship between rational numbers")
  (defmethod (r<= rational rational) (x y)
    (let* [((xn xd) (normalised-rational-components x))
           ((yn yd) (normalised-rational-components y))]
      (<= (* xn yd) (* yn xd))))
  
  (defmethod (r<= rational number) (x y) (r< x (->rat y)))
  (defmethod (r<= number rational) (x y) (r< (->rat x) y))
  (defmethod (r<= number number)   (x y) (r< (->rat x) (->rat y)))
  
  (defun r>= (x y)
    "Check if the rational number X is greater than or equal to the
     rational number Y"
    (r<= y x))
  
  (defun r> (x y)
    "Check if the rational number X is greater than the rational number Y"
    (r< y x))
  
  (defun r/ (x y) :hidden
    (r* x (recip y)))
  
  (defun rexp (x y) :hidden
    (if (>= y 0)
      (let* [((xn xd) (normalised-rational-components x))]
        (rational (^ xn y) (^ xd y)))
  