急切评估/应用订单和懒惰评估/正常订单

Rya*_* Li 15 evaluation programming-languages sicp

据我所知,急切评估/应用顺序在应用之前评估函数的所有参数,另一方面,惰性评估/正常顺序仅在需要时评估参数.

那么,热切评估应用顺序,懒惰评估正常秩序这两个术语之间有什么区别?

谢谢.

sep*_*p2k 9

延迟评估最多评估一个术语一次,而正常的评估则会像出现时那样经常评估.因此,例如,如果您有f(x) = x+x并且您调用它,f(g(42))g(42)在惰性评估或应用顺序下调用一次,但在正常顺序下调用两次.

急切的评估和应用顺序是同义词,至少在使用计算机程序的结构和解释中找到的应用顺序的定义时,这似乎与您的匹配.(维基百科对应用顺序的定义略有不同,并将其作为热切评估的特例).

  • @Ryan:显然,"懒惰评估"页面使用的应用顺序定义与"评估策略"页面不同.我认为在这种情况下,最好只是忽略维基百科,并选择SICP所说的内容. (2认同)
  • 不幸的是,维基百科文章对这些概念非常混乱。据我所知,这个答案或多或少是正确的。我会稍微吹嘘一下,“应用顺序”是指急切求值策略(按值调用/按引用调用)使用的求值顺序,而“正常顺序”是指惰性求值策略(按名称调用)使用的求值顺序/按需要调用)。不过,这可能只是我的特殊解释。结论:如果您在书面中使用过这些词,请明确定义它们!:) (2认同)

iva*_*nmp 5

我也在读SICP,我对作者给出的正常顺序的定义感到好奇.它似乎与我的懒惰评价相似,所以我去寻找关于两者的更多信息.

我知道很久以前就问了这个问题,但我查看了常见问题,并没有提到回答旧问题,所以我想我会留下我在这里找到的内容,以便其他人可以在将来使用它.

这是我发现的,我倾向于同意这些:

我认为(和其他人一样)惰性评估和NormalOrderEvaluation是两个不同的东西; 差异在上面提到.在延迟评估中,参数的评估将推迟到需要时,此时将评估参数并保存其结果(已记忆).函数中参数的进一步使用使用计算值.C/C++运算符||,&&和?:都是懒惰评估的例子.(除非一些新手C/C++程序员足够重载以及&|或||,在这种情况下,重载版本会按严格的顺序进行评估;这就是为什么&&和||运算符永远不应该在C++中重载的原因).

换句话说,每个参数最多只评估一次,可能根本不评估.

另一方面,NormalOrderEvaluation每次使用时都会重新计算表达式.考虑C宏,支持它的语言中的CallByName,以及循环控制结构的语义等.正常顺序评估可能比应用程序订单评估花费更长的时间,并且可能导致副作用不止一次发生.(这就是为什么,当然,带有副作用的语句通常不应该作为C/C++中宏的参数给出)

如果参数是不变的并且没有副作用,那么两者之间的唯一区别就是性能.实际上,在纯函数式语言中,惰性eval可以被视为正态次序评估的优化.如果存在副作用,或者在重新评估时可以返回不同值的表达式,则两者具有不同的行为; 由于在没有ReferentialTransparency的情况下难以推理此类程序,正常的订单评估尤其在程序语言中声名狼借

还应注意,严格顺序评估(以及惰性评估)可以通过显式备忘录支持正常顺序评估的语言来实现.相反的情况并非如此; 它需要传递可以调用/消息的thunk,函数或对象,以便推迟/重复评估.

懒惰评估结合了正常订单评估和共享:

•在您必须(正常订购)之前不要评估某些内容

•永远不要评估某些内容(共享)

http://c2.com/cgi/wiki?LazyEvaluation

http://cs.anu.edu.au/student/comp3610/lectures/Lazy.pdf