aboutsummaryrefslogtreecommitdiff
path: root/v3.scm
diff options
context:
space:
mode:
Diffstat (limited to 'v3.scm')
-rw-r--r--v3.scm41
1 files changed, 41 insertions, 0 deletions
diff --git a/v3.scm b/v3.scm
new file mode 100644
index 0000000..b2bc523
--- /dev/null
+++ b/v3.scm
@@ -0,0 +1,41 @@
+(define-module (v3)
+ :use-module (oop goops)
+ :re-export (+ - * abs)
+ :export (v3))
+
+(define-class <v3> ()
+ (x getter: x init-keyword: x:)
+ (y getter: y init-keyword: y:)
+ (z getter: z init-keyword: z:))
+
+(define (v3 x y z)
+ (make <v3> x: x y: y z: z))
+
+(define-generic +)
+(define-generic -)
+(define-generic *)
+(define-generic abs)
+
+(define-method (+ (v <v3>) (u <v3>))
+ (v3 (+ (x v) (x u))
+ (+ (y v) (y u))
+ (+ (z v) (z u))))
+
+(define-method (- (v <v3>))
+ (v3 (- (x v))
+ (- (y v))
+ (- (z v))))
+
+(define-method (- (v <v3>) (u <v3>))
+ (+ v (- u)))
+
+(define-method (* (v <v3>) (u <v3>))
+ (+ (* (x v) (x u))
+ (* (y v) (y u))
+ (* (z v) (z u))))
+
+(define-method (abs (v <v3>))
+ (sqrt (* v v)))
+
+(define-method (write (v <v3>) port)
+ (write `(v3 ,(x v) ,(y v) ,(z v)) port ))