Pet*_*son 6 language-agnostic operator-precedence
在大多数编程语言中,传递给函数的参数在函数使用它们之前进行求值,也就是说,它们会被急切地评估.
对我来说,似乎只有在函数使用它们时才评估参数会更有意义,也就是说,懒惰.这对我来说更有意义,因为它似乎会带来性能上的好处:为什么要评估从未需要的东西?
此外,假设您想要实现一个if接受布尔值的函数,如果布尔值为true则返回一个返回的对象,如果布尔值为假则返回另一个返回的对象:
object if(bool condition, object valueIfTrue, object valueIfFalse) {
if(condition) return valueIfTrue;
return valueIfFalse;
}
Run Code Online (Sandbox Code Playgroud)
在一种急切评估参数的语言中,两个对象总是被评估,即使该函数总是只需要其中一个,这充其量只会产生轻微的不必要的开销,并且最坏的情况会导致无限循环.
也就是说,由于大多数编程语言都使用对函数参数的热切评估,我认为必须有一个理由为什么它通常以这种方式完成.这里有一些热切评估的好处,我忽略了,是因为它更容易以这种方式实现语言,它只是传统,还是什么?
我看到了一些热切评估的原因,这两个原因都非常重要:
懒惰评估可以是一个强大的工具,但它并非没有它的成本.纯功能语言倾向于避免问题#1,因为它们没有副作用(一般情况下),但有时仍被问题#2咬伤.允许延迟评估的语言(LISP宏是这种形式,虽然与懒惰评估不同)可以兼顾两个方面的优势,但代价是程序员更多的努力.