当前位置: 首页 > 知识库问答 >
问题:

评估顺序复合程序元循环“适用”

师赤岩
2023-03-14

我正在学习SICP第4章及其元循环方案评估器的实现。我很难理解用户定义的过程是如何由它的<代码>应用过程来处理的。

元循环求值器由两个主要过程组成:valApplication。基本思想是递归地应用val,直到只有自求值表达式(如数字和字符串)或具有原始过程的表达式可以由Application直接处理。

evaluator遵循评估的环境模型工作,我们将变量绑定到它们的关联值,并在每次调用lambda时创建新的帧。过程定义是这样处理的。过程名在环境中绑定,当调用它时,它的主体将在一个新的框架中求值,其中的参数已绑定到用于调用它的参数。

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

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

一个用户定义的过程由复合过程识别 谓词。eval序列过程只计算(过程主体过程)(扩展环境…) 并返回最后一个表达式的值。

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

         (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,只有在这种情况下,方块的主体才会被执行。但是这个顺序似乎被应用过程颠倒了,其中在将参数绑定到参数之前,过程的主体会被评估。

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


共有1个答案

司寇星海
2023-03-14

(过程主体过程)不计算过程主体,它只是返回它。

程序主体通过eval sequence进行评估。它接收新环境作为第二个参数,该环境由扩展环境创建,它将所有参数绑定添加到环境中。

然后在扩展环境的作用域中计算过程主体。

 类似资料:
  • 问题内容: 有人可以解释一下SELECT语句的概念执行顺序是什么,请提供一个示例吗? 我在Google上进行了搜索,但它们似乎都使用了相同的示例,而没有详尽的解释。 问题答案: 从概念上讲,按以下顺序评估查询: 该条款 该条款 该条款 该条款 该条款 该条款 这是“概念性”处理,解释了SQL的一些作用域规则。实际上,查询的执行方式可能有所不同。 SQL Server文档在此处说明了此顺序。

  • 那么,为什么在第一个示例中这是有效的呢?

  • 是OCaml内置的函数。 经验: 我的问题:的求值顺序是什么? 是先将求值为8,然后将求值为11?还是先将求值为函数,然后将用作函数的参数? 谢谢

  • Q.while循环条件是作为一个整体进行计算,还是在决定是否进入循环之前一次计算一个条件?

  • 问题内容: 为什么这些示例中的第一个不起作用,而其他所有示例都起作用? 问题答案: 这既不是范围问题,也不是关闭问题。问题在于 声明 和 表达式 之间的理解。 JavaScript代码(即使是Netscape的第一个JavaScript版本和Microsoft的第一个副本)也要分两个阶段处理: 阶段1:编译-在此阶段,代码被编译成语法树(字节码或二进制取决于引擎)。 阶段2:执行-然后解析解析的代

  • 问题内容: 我有以下查询: 我有以下问题: USING语法与ON语法同义吗? 这些联接是从左到右评估的吗?换句话说,此查询是否说:x =公司加入了用户;y = x JOIN工作;z = y加入用户帐户; 如果对问题2的回答为“是”,那么可以安全地假设“公司”表中包含“公司ID”,“用户ID”和“工作ID”列? 我不明白在引用别名“ j”时,如何使用WHERE子句来选择公司表上的行 任何帮助,将不胜