From e52a5803ba45926a6637ddae2ab9e5ba9f86d516 Mon Sep 17 00:00:00 2001 From: Alex Klinkhamer Date: Wed, 23 Jul 2008 22:30:11 -0400 Subject: [PATCH] +More treating lists as vectors And vector subtraction works. --- src/overload/concatenate.lisp | 12 ++++++++++++ src/overload/tuples.lisp | 41 +++++++++++++++++++++++++++++++++++++---- 2 files changed, 49 insertions(+), 4 deletions(-) diff --git a/src/overload/concatenate.lisp b/src/overload/concatenate.lisp index 5cc3400..7c256c6 100644 --- a/src/overload/concatenate.lisp +++ b/src/overload/concatenate.lisp @@ -15,6 +15,18 @@ (car args)) (throw 'over-ex "Can't vcat nothing."))) +(defmethod cat2 ((u list) v) + (cat2 (tuple-list u) v)) + +(defmethod cat2 (u (v list)) + (cat2 u (tuple-list v))) + +(defmethod vcat2 ((u list) v) + (vcat2 (tuple-list u) v)) + +(defmethod vcat2 (u (v list)) + (vcat2 u (tuple-list v))) + ;V The do* macro with tails.V (defmacro tails-do* (((&body tails-args) . do-args) diff --git a/src/overload/tuples.lisp b/src/overload/tuples.lisp index b0b2e9d..90c3c2f 100644 --- a/src/overload/tuples.lisp +++ b/src/overload/tuples.lisp @@ -5,6 +5,10 @@ (dim 0 :type (integer 0 *)) (elems nil :type list)) +(defmacro tuple-list (u &optional len) + `(make-tuple :dim ,(if len len `(length ,u)) + :elems ,u)) + ;;; Make sure tuple /u/ is represented by a cons. ;;; Optionally do dimension checking. (defmacro ensure-tuple-is-cons @@ -62,6 +66,7 @@ (make-tuple :dim tdim :elems (tuple-orth u v)))) +;;; u + v (defmethod add2n ((u tuple) (v tuple)) (if (= (tuple-dim u) (tuple-dim v)) (make-tuple @@ -69,25 +74,53 @@ :elems (tuple-addn (tuple-elems u) (tuple-elems v))) (throw 'over-ex "don't add vectors of different dimension"))) -(defmethod subtr2n ((a tuple) (b tuple)) - (if (= (tuple-dim a) (tuple-dim b)) +(defmethod add2n ((u tuple) (v list)) + (add2n u (tuple-list v))) + +(defmethod add2n ((u list) v) + (add2n (tuple-list u) v)) + +;;; u - v +(defmethod subtr2n ((u tuple) (v tuple)) + (if (= (tuple-dim u) (tuple-dim v)) (make-tuple - :dim (tuple-dim a) - :elemes (tuple-addn a b)) + :dim (tuple-dim u) + :elems (tuple-subtrn (tuple-elems u) (tuple-elems v))) (throw 'over-ex "don't subtract vectors of different dimension"))) +(defmethod subtr2n ((u tuple) (v list)) + (subtr2n u (tuple-list v))) + +(defmethod subtr2n ((u list) v) + (subtr2n (tuple-list u) v)) + +;;; k * u (defmethod mult2n ((k number) (u tuple)) (make-tuple :dim (tuple-dim u) :elems (scalar-tuple-multn k (tuple-elems u)))) + +(defmethod mult2n ((k number) (u list)) + (make-tuple :dim (length u) + :elems (scalar-tuple-multn k u))) + (defmethod mult2n ((u tuple) (k number)) (make-tuple :dim (tuple-dim u) :elems (scalar-tuple-multn k (tuple-elems u)))) +(defmethod mult2n ((u list) (k number)) + (make-tuple :dim (length u) + :elems (scalar-tuple-multn k u))) + +;;; u / k (defmethod divis2n ((u tuple) (k number)) (make-tuple :dim (tuple-dim u) :elems (tuple-scalar-divisn (tuple-elems u) k))) +(defmethod divis2n ((u list) (k number)) + (make-tuple :dim (length u) + :elems (tuple-scalar-divisn u k))) + -- 2.11.4.GIT