"Evaluation" 的含义

Meaning of "Evaluation"

我正在尝试理解 "evaluation" 的含义。

我正在学习 Scala 中的按名称调用和按值调用,但我对求值的含义感到困惑。它是编译器为理解我的代码而执行的操作,还是在实际调用方法之前对方法执行 executing/verifying 之类的操作?

除了评估策略,我找不到明确的解释。

您能否解释一下对以下示例的评估?

 def callByValue(x : Unit) = {
    for (i <- 0 until 5) {
      print(x)
    }
  }

  def callByName(x : => Unit) = {
    for (i <- 0 until 5) {
      print(x)
    }
  }

让我们考虑一个更简单的例子。

def callByValue(x : Unit)   = if (1 > 0) () else x
def callByName(x : => Unit) = if (1 > 0) () else x

请注意,1 > 0 当然总是 true,因此这些方法都不能 return x 值。

现在让我们打电话给他们。

callByValue(println("Value"))  // res0: Unit = ()
callByName(println("Name"))    // res1: Unit = ()

两次调用 return (),这是类型 Unit 的唯一值,但第一个 callByValue() 有副作用。它将单词 "Value" 打印到 STDOUT。单词 "Name" 未打印。这是为什么?

这是因为传递给callByValue()的参数在调用方法时求值(即执行)。 callByName() 的参数在引用参数 x 之前不会被计算,但它永远不会被引用,因为 if 条件总是 trueelse 子句永远不会执行,并且永远不会评估 x

.. the meaning of "evaluation" ... Is it something that compiler performs to understand my code or is it something like executing/verifying of a method before the actual call to the method ?

有很多很好的例子可以说明评估策略之间的差异,例如@jwvh 给出的那个。还有一篇关于此主题的 wikipedia 文章。

在我看来,您对 "evaluation" 这个词感到困惑。如果您考虑解释器而不是编译器,也许会更容易。解释器正在执行您的程序,也称为评估。例如 Python 附带一个内置函数 eval (顺便说一句,还有 "exec")。

"Evaluation strategy" 表示 何时如何 解释器将 execute/evaluate 将 return实际参数值。

对于已编译的程序,除了编译器在生成可执行代码时做出此决定(实际上是程序员在定义函数时做出的决定)之外,这是相同的。