applicative-order / call-by-value和normal-order / call-by-name差异

时间:2014-10-23 07:11:55

标签: scheme programming-languages evaluation sicp operator-precedence

背景

我正在根据在线课程学习sicp,并对其课程笔记感到困惑。在讲义中,应用顺序似乎等于cbv和cbn的正常顺序。

混乱

但是wiki指出,除了评估订单(从左到右,从右到左,或同时),应用订单和cbv之间存在差异:

  

与按值调用不同,应用顺序评估会在应用函数之前尽可能地减少函数体内的术语。

我不明白减少是什么意思。在进入功能评估之前,不是应用顺序和cbv都会获得变量的确切值。

对于正常的顺序和cbv,根据wiki我更加困惑。

  

相比之下,按名称调用策略不会在未应用函数的主体内部进行求值。

我想这是否意味着正常的顺序会在未应用的函数体内进行评估。怎么会这样?

问题

  1. 有人可以给我一些更具体的四种策略定义。
  2. 有人可以使用任何编程语言为每个策略显示一个示例。
  3. 非常感谢?

1 个答案:

答案 0 :(得分:4)

申请顺序(不考虑 评估的顺序,在方案中是未定义的)将等同于cbv。在进入函数体之前,将完全评估函数调用的所有参数。这是给出的例子 SICP

(define (try a b)
  (if (= a 0) 1 b))

如果定义了该函数,并使用以下参数调用它:

(try 0 (/ 1 0))

当使用应用程序订单评估(默认方案)时,这将产生错误。它会评估 (/ 1 0)进入身体之前。在正常的订单评估中,这将返回1.参数 将在没有评估的情况下传递给函数体,(/ 1 0)永远不会被评估,因为(= a 1)为真,避免了错误。

在您链接的文章中,当他们提到Applicative和Normal订单评估时,他们正在讨论Lambda Calculus。在这篇文章wiki我认为更清楚地解释了这一点。 减少意味着将减少规则应用于表达式。 (也在链接中)。

  

α转换:改变绑定变量(alpha);

     

β减少:将函数应用于其参数(beta);

正常顺序:

  

最左边的最外面的redex总是先减少。也就是说,只要有可能,在参数减少之前,参数就会被替换为抽象体。

通话按姓名

  

按照正常顺序,但在抽象内部不执行缩减。例如,根据这种策略,λx。(λx.x)x是正常形式,尽管它包含redex(λx.x)x。

     

正常形式是一种等效表达式,在表格

规定的规则下不能再进一步减少

在同一篇文章中,他们谈到了按值调用

  

只减少最外层的重新索引:只有当右侧的值减少到一个值(变量或lambda抽象)时,才会减少重新索引。

申请顺序:

  

最左边的最里面的redex总是先减少。直观地说,这意味着函数的参数总是在函数本身之前减少。

您可以阅读我链接的文章,了解有关lambda-calculus的更多信息。 另外Programming Language Foundations