+More treating lists as vectors
authorAlex Klinkhamer <grencez@gmail.com>
Thu, 24 Jul 2008 02:30:11 +0000 (23 22:30 -0400)
committerAlex Klinkhamer <grencez@gmail.com>
Thu, 24 Jul 2008 02:30:11 +0000 (23 22:30 -0400)
And vector subtraction works.

src/overload/concatenate.lisp
src/overload/tuples.lisp

index 5cc3400..7c256c6 100644 (file)
       (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)
index b0b2e9d..90c3c2f 100644 (file)
@@ -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
       :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)))
+