关于功能:”按值调用”的不同含义是否相关?

Are the different meanings of "call-by-value" related?

目前我正在学习关于编程语言概念的课程,这就是我遇到的一个曾经让我感到困惑的问题(当我在 Coursera 上观看 Martin Odersky 的函数式编程课程的视频时):

术语"按值调用"经常在两种不同的上下文中使用:

上下文 1:评估机制(按值调用与按名称调用)

如果将一个表达式作为参数传递给函数,在函数体中的参数标识符被替换之前,该表达式是否被简化为一个值(即求值)?如果是,则称为按值调用,如果不是,则称为按名称调用。至少我是这么理解的。

上下文 2:参数传递(按值调用与按引用调用)

如果将一个标识符作为参数传递给函数,那么函数的主体是否正在使用一个新名称绑定进行评估,该名称绑定指向给定标识符所指向的副本,或者该函数是否可以实际更改标识符指向什么,即对调用上下文"可见"的变化?同样,第一个变体将是按值调用,而第二个变体将是按引用调用。当然,如果我猜对了。

然而,尽管我没有看到术语"按值调用"的两个用例之间的关系,但在这两个场景中意外使用该术语似乎太巧合了。

有人知道为什么选择同一个词来描述两个(看似不同的)问题吗?


您的分析是正确的,我也发现短语"call-by-value"的重载令人困惑。

采用维基百科相关文章中的语言,按值调用和按引用调用可以认为是"严格评估"的两种变体,而按名称调用是"非严格"的一种评估"。

为了回答你的问题,我有一个推测,一般来说,草率地使用短语"call-by-value"来指代"严格评估"是因为 call-by- value 是一些最流行的命令式编程语言实现的严格评估类型。 UMD PL 课程中的一些旧讲义将您描述的两种情况混为一谈。他们将保护参数免受修改称为 C、C 和 Java 中按值调用的"另一个特性"(幻灯片 21),其中暗示(错误地恕我直言)严格评估是调用的最终特性——按价值。