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