我正在根据在线课程学习sicp,并对其课程笔记感到困惑。在讲义中,应用顺序似乎等于cbv和cbn的正常顺序。
但是wiki指出,除了评估订单(从左到右,从右到左,或同时),应用订单和cbv之间存在差异:
与按值调用不同,应用顺序评估会在应用函数之前尽可能地减少函数体内的术语。
我不明白减少是什么意思。在进入功能评估之前,不是应用顺序和cbv都会获得变量的确切值。
对于正常的顺序和cbv,根据wiki我更加困惑。
相比之下,按名称调用策略不会在未应用函数的主体内部进行求值。
我想这是否意味着正常的顺序会在未应用的函数体内进行评估。怎么会这样?
非常感谢?
答案 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