使用分号语法了解评估和执行顺序

Understanding the evaluation and execution order with semicolon syntax

我已经从 那里学到了一些关于 FFL 分号的知识。然而,目前还不清楚他们执行的评估或执行顺序是什么。所以这是一个更具体的例子:

 [ expr_a, expr_b ; expr_c, expr_d ; expr_e, expr_f ]

以上代码的执行顺序应该是怎样的?在我看来,应该是:

  1. 评估 a 和 b
  2. 执行a,执行b
  3. 评估 c 和 d
  4. 执行c,执行d
  5. 评估 e 和 f
  6. 执行e,执行f

现在让我们假设 expr_b = add(test_list, ['b saw ' + str(test_list)]) 和所有其他表达式类似。那么test_list的最终内容是什么?

在我看来,应该是:

a saw []

b saw []

c saw [a saw [], b saw []]

d saw [a saw [], b saw []]

e saw [a saw [], b saw [], c saw [a saw [], b saw []], d saw [a saw [], b saw []]]

f saw [a saw [], b saw [], c saw [a saw [], b saw []], d saw [a saw [], b saw []]]

请解释为什么不是这样。

首先,您可能不想完全像这样编写代码。一般来说,分号的优先级很低,但列表字面量不是运算符,代码如下所示:

[a, (b; c), (d; e), f]

这意味着您将并行启动四个命令管道(尽管其中两个只有一个成员)。它将评估 abdf。然后它会执行a的结果,然后是b的结果。执行 b 将触发命令管道中的下一步,因此它将评估并执行 c。然后它会执行d,然后计算并执行e,最后它会执行f.

所以:

a saw []
b saw []
c saw [a saw [], b saw []]
d saw []
e saw [a saw [], b saw [], c saw [a saw [], b saw []], d saw []]
f saw []