评估复合程序元循环“应用”的顺序
Posted
技术标签:
【中文标题】评估复合程序元循环“应用”的顺序【英文标题】:Order of evaluation compound procedures metacircular 'apply' 【发布时间】:2020-11-14 15:05:24 【问题描述】:我正在研究SICP chapter 4 及其对元循环方案评估器的实现。我很难理解其apply
过程如何处理用户定义的过程。
元循环评估器由两个主要程序组成:eval
和apply
。基本思想是递归应用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
提供。以上是关于评估复合程序元循环“应用”的顺序的主要内容,如果未能解决你的问题,请参考以下文章