Rya*_* Li 15 evaluation programming-languages sicp
据我所知,急切评估/应用顺序在应用之前评估函数的所有参数,另一方面,惰性评估/正常顺序仅在需要时评估参数.
那么,热切评估和应用顺序,懒惰评估和正常秩序这两个术语之间有什么区别?
谢谢.
延迟评估最多评估一个术语一次,而正常的评估则会像出现时那样经常评估.因此,例如,如果您有f(x) = x+x并且您调用它,f(g(42))则g(42)在惰性评估或应用顺序下调用一次,但在正常顺序下调用两次.
急切的评估和应用顺序是同义词,至少在使用计算机程序的结构和解释中找到的应用顺序的定义时,这似乎与您的匹配.(维基百科对应用顺序的定义略有不同,并将其作为热切评估的特例).
我也在读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