评估复合程序元循环“应用”的顺序

Posted

技术标签:

【中文标题】评估复合程序元循环“应用”的顺序【英文标题】:Order of evaluation compound procedures metacircular 'apply' 【发布时间】:2020-11-14 15:05:24 【问题描述】:

我正在研究SICP chapter 4 及其对元循环方案评估器的实现。我很难理解其apply 过程如何处理用户定义的过程。

元循环评估器由两个主要程序组成:evalapply。基本思想是递归应用eval,直到只有自求值表达式(如数字和字符串)或具有可以由apply 直接处理的原始过程的表达式。

评估器按照environment model of evaluation 工作,我们将变量绑定到它们的关联值,并在每次调用lambda 时创建新帧。以这种方式处理过程定义。过程名称绑定在环境中,当它被调用时,它的主体在一个新框架中进行评估,其中参数已绑定到用于调用它的参数。

此特定部分反映在apply 过程的以下几行中:

(define (apply procedure arguments)
  (cond (...)
        ((compound-procedure? procedure)
         (eval-sequence
           (procedure-body procedure)
           (extend-environment
             (procedure-parameters procedure)
             arguments
             (procedure-environment procedure))))
        (...)

compound-procedure? 谓词可以识别用户定义的过程。 eval-sequence 过程只是按顺序计算 (procedure-body procedure)(extend-environment ...) 并返回最后一个表达式的值。

我的问题是,据我了解,我们应该首先扩展环境,然后然后评估过程的主体:

         (eval-sequence
           (extend-environment
             (procedure-parameters procedure)
             arguments
             (procedure-environment procedure))
           (procedure-body procedure))

例如在:

(define (square x) (* x x))
(square 5)

第一行将square 绑定到一个lambda(及其相关参数和主体)。此绑定将在第二行中识别。然后我知道我们创建了一个新框架,其中x = 5 然后才执行正方形的主体。但是这个顺序似乎被apply 过程颠倒了,在将参数绑定到实参之前评估过程的主体。

如果有人能帮助我理解这个问题,我将不胜感激。

【问题讨论】:

【参考方案1】:

(procedure-body procedure) 不计算 procedure 的主体,它只是返回它。

过程的主体由eval-sequence 评估。它接收新环境作为其第二个参数,该环境由extend-environment 创建,它将所有参数绑定添加到环境中。

然后eval-sequence 评估该扩展环境范围内的过程主体。

【讨论】:

非常感谢。我忽略了eval-sequence 接受了一个环境作为第二个参数,在这种情况下由extend-environment 提供。

以上是关于评估复合程序元循环“应用”的顺序的主要内容,如果未能解决你的问题,请参考以下文章

顺序程序设计

渴望评估/应用顺序和惰性评估/正常顺序

令矩阵每个元素四舍五入,使顺序高斯与列主元高斯结果不同

备战数学建模2-MATLAB中顺序,选择,循环及函数的应用

在C中调用函数之前的参数评估顺序[重复]

Java基础语法之控制流程