scheme - 复合程序元循环的评估顺序 'apply'

标签 scheme evaluation sicp mit-scheme order-of-execution

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

元循环评估器由两个主要程序组成:evalapply 。基本思想是递归应用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/

相关文章:

scheme - call/cc 是这样模拟 goto 的吗?

lisp - 来自 "Realm of Racket"的奇怪代码示例

algorithm - SICP,费马测试问题

java - Java 的函数满足第一类元素定义中的这些点中的多少个?

recursion - 方案中的迭代图

list - 在 Scheme 中查找列表的最大值和最小值

stream - 在 Drracket 中获取 #stream 作为输出

javascript - setAttribute 在 a 内使用 javascript 进行评估

machine-learning - 国际象棋评价函数的训练

java - JFreeChart Boxplot Outlier 和 Farout 外观