2 (in-package :lineal.overload
)
5 (dim 0 :type
(integer 0 *))
6 (elems nil
:type list
))
8 ;;; Make sure tuple /u/ is represented by a cons.
9 ;;; Optionally do dimension checking.
10 (defmacro ensure-tuple-is-cons
14 (unless (= (length ,u
) ,dim
)
15 (throw 'over-ex
,str
))
16 (if (= (tuple-dim ,u
) ,dim
)
17 (setq ,u
(tuple-elems ,u
))
18 (throw 'over-ex
,str
)))
20 (setq ,u
(tuple-elems ,u
)))))
22 (defun over-dot-prod (u v
)
23 (declare (type (or tuple cons
) u
)
24 (type (or tuple cons
) v
))
26 (if (consp u
) u
(tuple-elems u
))
27 (if (consp v
) v
(tuple-elems v
))))
29 (defun over-cross-prod (u v
)
30 (declare (type (or tuple cons
) u
)
31 (type (or tuple cons
) v
))
33 u
3 "cross products require 3-D vectors")
35 v
3 "cross products require 3-D vectors")
36 (make-tuple :dim
3 :elems
(tuple-cross3 u v
)))
38 ;;; Projection of /u/ onto /v/.
39 (defun over-proj (u v
)
40 (declare (type (or tuple cons
) u
)
41 (type (or tuple cons
) v
))
43 (if (consp u
) (length u
)
45 (setq u
(tuple-elems u
))))))
47 v tdim
"proj requires vectors of same dimension")
49 :elems
(tuple-proj u v
))))
51 ;;; Orthogonal component of the
52 ;;; projection of /u/ onto /v/.
53 (defun over-orth (u v
)
54 (declare (type (or tuple cons
) u
)
55 (type (or tuple cons
) v
))
57 (if (consp u
) (length u
)
59 (setq u
(tuple-elems u
))))))
61 v tdim
"orth requires vectors of same dimension")
63 :elems
(tuple-orth u v
))))
65 (defmethod add2n ((u tuple
) (v tuple
))
66 (if (= (tuple-dim u
) (tuple-dim v
))
69 :elems
(tuple-addn (tuple-elems u
) (tuple-elems v
)))
70 (throw 'over-ex
"don't add vectors of different dimension")))
72 (defmethod subtr2n ((a tuple
) (b tuple
))
73 (if (= (tuple-dim a
) (tuple-dim b
))
76 :elemes
(tuple-addn a b
))
77 (throw 'over-ex
"don't subtract vectors of different dimension")))
79 (defmethod mult2n ((k number
) (u tuple
))
80 (make-tuple :dim
(tuple-dim u
)
81 :elems
(scalar-tuple-multn
83 (defmethod mult2n ((u tuple
) (k number
))
84 (make-tuple :dim
(tuple-dim u
)
85 :elems
(scalar-tuple-multn
88 (defmethod divis2n ((u tuple
) (k number
))
89 (make-tuple :dim
(tuple-dim u
)
90 :elems
(tuple-scalar-divisn