さかもとのブログ

つらつらと

SICP演習問題2.78

;;;excercise2.79
; tagをつける必要がなくなる
(define (install-shceme-number-package2)
  (put 'add '(scheme-number scheme-number)
       (lambda (x y) (+ x y)))
  (put 'sub '(scheme-number scheme-number)
       (lambda (x y) (- x y)))
  (put 'mul '(scheme-number scheme-number)
       (lambda (x y) (* x y)))
  (put 'div '(scheme-number scheme-number)
       (lambda (x y) (/ x y)))
  (put 'make 'scheme-number
       (lambda (x) (tag x)))
  'done)
(define (add x y) (apply-generic 'add x y))
(define (mul x y) (apply-generic 'mul x y))
(define (sub x y) (apply-generic 'sub x y))
(define (div x y) (apply-generic 'div x y))
(add 1 2)
(mul 1 2)
(sub 2 3)
(div 2 3)

;例えばrational packageも使いたい
(install-rational-packeage)
(define rat1 ((get 'make 'rational) 1 2))
(define rat2 ((get 'make 'rational) 4 5))
(add rat1 rat2)
(mul rat1 rat2)