评估复合程序的顺序 metacircular 'apply'
Order of evaluation compound procedures metacircular 'apply'
我正在研究 SICP chapter 4 及其对元循环方案评估器的实现。我很难理解其 apply
过程如何处理用户定义的过程。
元循环求值器由两个主要程序组成:eval
和apply
。基本思想是递归应用 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
在该扩展环境的范围内计算过程体。
我正在研究 SICP chapter 4 及其对元循环方案评估器的实现。我很难理解其 apply
过程如何处理用户定义的过程。
元循环求值器由两个主要程序组成:eval
和apply
。基本思想是递归应用 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
在该扩展环境的范围内计算过程体。