SICP 全笔记

Exercise 2.83. Suppose you are designing a generic arithmetic system for dealing with the tower of types shown in figure 2.25: integer, rational, real, complex. For each type (except complex), design a procedure that raises objects of that type one level in the tower. Show how to install a generic raise operation that will work for each type (except complex).

如果我们要设计这样的系统的话,在 integer 中定义

(define (raise x)
  (make-rational x 1))
(put 'raise 'integer raise)

而在 rational 中定义

(define (raise x)
  (make-real (/ (numer x) (denom x))))

(put 'raise 'rational raise)

在 real 中定义

(define (raise x)
  (make-complex-from-real-imag x 0))

(put 'raise 'real raise)

最终的泛型 raise 可以如下定义:

(define (raise x)
  ((get 'raise (type-tag x)) (contents x)))