用来评估(sfp)的替代模型

问题描述 投票:0回答:1

我正在从事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”的一级。

scheme sicp
1个回答
1
投票

如果定义两个等效过程,然后重命名变量以区别它们,则可以看到正在发生的事情要容易一些。

(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)
© www.soinside.com 2019 - 2024. All rights reserved.