我正在学习SICP第4章及其元循环方案评估器的实现。我很难理解用户定义的过程是如何由它的<代码>应用过程来处理的。
元循环求值器由两个主要过程组成:val
和Application
。基本思想是递归地应用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
,只有在这种情况下,方块的主体才会被执行。但是这个顺序似乎被应用
过程颠倒了,其中在将参数绑定到参数之前,过程的主体会被评估。
如果有人能帮我理解这个问题,我将不胜感激。
(过程主体过程)
不计算过程主体,它只是返回它。
程序主体通过
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子句来选择公司表上的行 任何帮助,将不胜