评估复合程序的顺序 metacircular 'apply'

Order of evaluation compound procedures metacircular 'apply'

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

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

直接处理

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

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

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

compound-procedure? 谓词识别用户定义的过程。 eval-sequence 过程只是依次计算 (procedure-body procedure)(extend-environment ...) 以及 returns 最后一个表达式的值。

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

         (eval-sequence
           (extend-environment
             (procedure-parameters procedure)
             arguments
             (procedure-environment procedure))
           <b>(procedure-body procedure)</b>)

例如:

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

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

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

(procedure-body procedure) 不评估 procedure 的正文,它只是 returns 它。

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

然后 eval-sequence 在该扩展环境的范围内计算过程体。