aboutsummaryrefslogtreecommitdiff
path: root/v3.scm
blob: b2bc523137f64a95dfd7e7ca96833f22fd4ef27b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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 ))