【问题标题】:substitution model to evaluate (f f) in sicp在 sicp 中评估 (f f) 的替代模型
【发布时间】:2019-12-19 01:16:24
【问题描述】:

我正在练习 SICP 的练习 1.34

练习 1.34。假设我们定义了过程

(define (f g)
  (g 2))

那么我们有

(f square)
4

(f (lambda (z) (* z (+ z 1))))
6

如果我们(反常地)要求解释器评估组合(f f),会发生什么?解释。

参考解决方法:

第一步:

(f f)

第二步:

(f (lambda (g)
     (g 2)))

第三步:

((lambda (g)
    (g 2))
 (lambda (g)
    (g 2)))

第四步:

((lambda (g)
    (g 2))
 2)

第五步:

(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】:

    如果您定义两个等效的过程,并重命名变量以区分它们,则更容易查看发生了什么。

    (define (f1 g1)
      (g1 2))
    (define (f2 g2)
      (g2 2))
    

    现在问题是关于(f1 f2)。第三步变成:

    ((lambda (g1) ;; f1
        (g1 2))
     (lambda (g2) ;; f2
        (g2 2)))
    

    f1被调用时,g1被第二个过程替换,它调用(g1 2)。因此在第 4 步中,应用程序模型变为:

    ((lambda (g2) ;; f2
        (g2 2))
     2)
    

    【讨论】:

      猜你喜欢
      • 2021-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-31
      • 2013-02-01
      相关资源
      最近更新 更多