我正在从事SICP的练习1.34
锻炼1.34。假设我们定义过程
(define (f g)
(g 2))
那么我们有
(f square)
4
(f (lambda (z) (* z (+ z 1))))
6
如果(相反)要求口译员评估组合(f f)
,会发生什么?说明。
请参阅解决方案:
步骤1:
(f f)
步骤2:
(f (lambda (g)
(g 2)))
步骤3:
((lambda (g)
(g 2))
(lambda (g)
(g 2)))
步骤4:
((lambda (g)
(g 2))
2)
步骤5:
(2 2)
我知道前3个步骤,关于第4步,如何将第二个f评估为2?
其他解决方案
结果是错误:使用(f f)
中的替换规则
g = f : (g 2) -> (f 2)
再次使用(f 2)
中的替换规则
g = 2 : (f 2)-> (2 2) -> error.
DrRacket的实际错误是:
困惑仍然存在,我的头脑缓慢地跳到了“被评估为2”的一级。
如果定义两个等效过程,然后重命名变量以区别它们,则可以看到正在发生的事情要容易一些。
(define (f1 g1) (g1 2)) (define (f2 g2) (g2 2))
现在问题是关于
(f1 f2)
。步骤3变为:
((lambda (g1) ;; f1 (g1 2)) (lambda (g2) ;; f2 (g2 2)))
[调用
f1
时,将g1
替换为第二个过程,并调用(g1 2)
。因此,在步骤4中,它变为:
((lambda (g2) ;; f2
(g2 2))
2)