我正在学习SICP chapter 4及其元循环方案评估器的实现。我很难理解其 apply
如何处理用户定义的过程程序。
元循环评估器由两个主要程序组成:eval
和apply
。基本思想是递归应用eval
直到只有自求值表达式(如数字和字符串)或带有原始过程的表达式可以直接由 apply
处理.
评估器按照 environment model of evaluation 进行工作,我们将变量绑定(bind)到其关联值并每次创建新帧 lambda
被调用。过程定义就是这样处理的。过程名称绑定(bind)在环境中,当调用它时,它的主体在新框架中求值,其中参数已绑定(bind)到用于调用它的参数。
此特定部分反射(reflect)在 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 ...)
按顺序并返回最后一个表达式的值。
我的问题是,据我了解,我们应该首先扩展环境,然后才评估过程的主体:
(eval-sequence
(extend-environment
(procedure-parameters procedure)
arguments
(procedure-environment procedure))
<b>(procedure-body procedure)</b>)
例如:
(define (square x) (* x x))
(square 5)
第一行将绑定(bind)square
到 lambda(及其关联的参数和主体)。该绑定(bind)将在第二行中被识别。然后我知道我们创建了一个新框架,其中 x = 5
然后方体才被执行。但这个顺序似乎被apply
颠倒了。过程,其中在将形参绑定(bind)到实参之前对过程主体进行求值。
如果有人能帮助我理解这个问题,我将非常感激。
最佳答案
(procedure-body procedure)
不会评估 procedure
的主体,它只是返回它。
过程的主体由eval-sequence
求值。它接收新环境作为其第二个参数,该环境是由 extend-environment
创建的,它将所有参数绑定(bind)添加到环境中。
然后,eval-sequence
评估该扩展环境范围内的过程主体。
关于scheme - 复合程序元循环的评估顺序 'apply',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63078807/