在 sicp 中评估 (f f) 的替代模型

substitution model to evaluate (f f) in sicp

我正在做 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)

前三步我想通了,至于第四步,第二个f是怎么算成2的?

其他解决方案

结果出错:使用(f f)中的替换规则

g = f : (g 2) -> (f 2)

再次使用 (f 2)

中的替换规则
g = 2 : (f 2)-> (2 2) -> error.

DrRacket 的实际错误是:

迷茫依旧,思绪迟缓一步"to be evaluated as 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)