; Generic operator package ; number procedures for the generic package (define (make-number n) (attach-type 'number n)) (define (add-number x y) (make-number (+ x y))) (define (sub-number x y) (make-number (- x y))) (define (mult-number x y) (make-number (* x y))) (define (div-number x y) (make-number (/ x y))) ; complex number procedures for the generic package (define (make-complex z) (attach-type 'complex z)) (define (add-complex z1 z2) (make-complex (add-c z1 z2))) (define (sub-complex z1 z2) (make-complex (sub-c z1 z2))) (define (mult-complex z1 z2) (make-complex (mult-c z1 z2))) (define (div-complex z1 z2) (make-complex (div-c z1 z2))) (define (operate op arg1 arg2) (let ((t1 (type arg1))) (if (eq? t1 (type arg2)) (let ((proc (get t1 op))) (if (not (null? proc)) (proc (contents arg1) (contents arg2)) (error "Operator undefined on this type -- OPERATE" (list op arg1 arg2)))) (error "Operands not of same type -- OPERATE" (list op arg1 arg2))))) ; generic operators (define (add x y) (operate 'add x y)) (define (sub x y) (operate 'sub x y)) (define (mul x y) (operate 'mul x y)) (define (div x y) (operate 'div x y))