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

时间:2018-05-21 23:09:17

标签: syntax purely-functional anura ffl

我已经从previous question了解了一些关于FFL分号的内容。但是,仍然不清楚它们执行的评估或执行顺序。所以这是一个更具体的例子:

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

上述代码的执行顺序应该是什么?在我的脑海中,它应该是:

  1. 评估& B'/ LI>
  2. 执行a,执行b
  3. 评估c& d
  4. 执行c,执行d
  5. 评估e& ˚F
  6. 执行e,执行f
  7. 现在让我们想象一下expr_b = add(test_list, ['b saw ' + str(test_list)])和所有其他表达式的相似之处。那么test_list的最终内容是什么?

    在我脑海中,它应该是:

      

    锯[]

         

    b见[]

         

    c看到[锯[],b看[]]

         

    看到[锯[],b见[]]

         [锯] [锯[],锯[],锯[锯[],锯[]],锯[锯[],锯[]]

         看到[锯[],锯[],锯[锯[],锯[]],锯[锯[],锯[]]

    请解释为什么不是这样。

1 个答案:

答案 0 :(得分:3)

首先,您可能不希望完全像这样编写代码。通常,分号的优先级非常低,但列表文字不是运算符,代码将如下所示:

[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 []