对于应用顺序,参数的评估顺序是什么?从左到右还是从右到左?

With applicative order, what order are the arguments evaluated? Left to right or right to left?

在 SICP 部分 1.1.5 过程应用的替代模型我很好奇评估的应用顺序。

我知道应用顺序在应用外部过程之前评估参数。

我的问题是它通过参数的顺序是什么?

例如,

(+ (+ 2 1) (/ 10 2))

(+ 2 1)(/ 10 2) 会先评估吗?

未指定。

procedure calls 小节中,您可以找到非常详细的说明。

When a procedure call is evaluated, the operator and operand expressions are evaluated (in an unspecified order) and the resulting procedure is passed the resulting arguments.

在您的具体示例中,xy 之前评估,因为两个 define 是按顺序评估的。

在函数调用中,例如:(+ (+ 2 3) (- 4 5)) (+ 2 3)(- 4 5) 的求值顺序在 Scheme 中未指定,与其他答案相同。而在其他 lisp 语言中,比如在 Common Lisp 中,是从左到右。

我假设您还在阅读本书的第 1 章。请放心,本书的其余部分将向您更详细地解释这一点。目前,您可能对此感兴趣 footnote from section 3.2.1 The Rules for Evaluation:

... this order [left to right or right to left] should always be considered to be an implementation detail, and one should never write programs that depend on some particular order. For instance, a sophisticated compiler might optimize a program by varying the order in which subexpressions are evaluated.

后面的章节讨论这个问题会越来越详细。例如:

  • Exercise 3.8: "Define a simple procedure f such that evaluating (+ (f 0) (f 1)) will return 0 if the arguments to + are evaluated from left to right but will return 1 if the arguments are evaluated from right to left"
  • Exercise 4.1 - 更改元循环求值器中的求值顺序。
  • Section 5.4.1 The Core of the Explicit-Control Evaluator评估程序应用小节)- 显示如何在显式控制评估器中实施程序应用。在这里你可以清楚地看到参数评估循环的细节是如何决定评估顺序的。