SICP 全笔记

Exercise 1.41. Define a procedure double that takes a procedure of one argument as argument and returns a procedure that applies the original procedure twice. For example, if inc is a procedure that adds 1 to its argument, then (double inc) should be a procedure that adds 2. What value is returned by

(((double (double double)) inc) 5)

我们可以定义这几个必要的过程如下:

(define (double f)
  (lambda (x)
    (f (f x))))

(define (inc x)
  (+ 1 x))

(((double (double double)) inc) 5)

(((double (double double)) inc) 5) 我们可以使用代换模型来查看结果:

t1: (double double) => (lambda (x) (double (double x)))
t2: (double t1)     => (lambda (x1) (t1 (t1 x1)))
t3: (t2 inc)        => ((lambda (x1) (t1 (t1 x1))) inc)
                    => (t1 (t1 inc))
                    => (t1 ((lambda (x1) (double (double x1))) inc))
                    => (t1 (double double inc))
                    => ...
                    => (double (double (double (double inc))))
t4: (t3 5)          => ((t2 inc) 5)
                    => ((double (double (double (double inc)))) 5)
                    => ((double (double (double inc2))) 5)
                    => ((double (double inc4)) 5)
                    => ((double inc8) 5)
                    => (inc16 5)
                    => 21