;;
;; Vectors
;;

(define $dot-product
  (lambda [%v1 %v2]
    (with-symbols {i}
      (. v1~i v2_i))))

(define $V.* dot-product)

(define $cross-product/fn
  (lambda [$fn %a %b]
    [|(- (fn a_2 b_3)  (fn a_3 b_2))
      (- (fn a_3 b_1)  (fn a_1 b_3))
      (- (fn a_1 b_2)  (fn a_2 b_1))|]))

(define $cross-product
  (lambda [%a %b]
    (cross-product/fn * a b)))

(define $div
  (lambda [%A %xs]
    (trace (∇ A xs))))

(define $rot
  (lambda [%A %xs]
    (cross-product/fn ∂/∂ A xs)))