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