(define-module (v3) :use-module (oop goops) :re-export (+ - * abs) :export (v3)) (define-class () (x getter: x init-keyword: x:) (y getter: y init-keyword: y:) (z getter: z init-keyword: z:)) (define (v3 x y z) (make x: x y: y z: z)) (define-generic +) (define-generic -) (define-generic *) (define-generic abs) (define-method (+ (v ) (u )) (v3 (+ (x v) (x u)) (+ (y v) (y u)) (+ (z v) (z u)))) (define-method (- (v )) (v3 (- (x v)) (- (y v)) (- (z v)))) (define-method (- (v ) (u )) (+ v (- u))) (define-method (* (v ) (u )) (+ (* (x v) (x u)) (* (y v) (y u)) (* (z v) (z u)))) (define-method (abs (v )) (sqrt (* v v))) (define-method (write (v ) port) (write `(v3 ,(x v) ,(y v) ,(z v)) port ))