【问题标题】:Evaluation of "andalso" arguments评估“andalso”论点
【发布时间】:2015-09-12 21:14:25
【问题描述】:

我是 erlang 新手,我在 erlang shell 中尝试了以下操作:

1> ((Var1 = 13) == 13) andalso ((Var2 = 12) == 13).
false
2> Var1.
13
3> Var2.
* 1: variable 'Var2' is unbound
4>

为什么 Var2 变量没有绑定到值 12

【问题讨论】:

    标签: erlang boolean-expression short-circuiting


    【解决方案1】:

    E1 andalso E2(我认为是 R13)相当于

    case E1 of
        false -> false;
        _ -> E2
    end;
    

    与这个定义相比,我同意 Var2 在你的情况下应该是有界的。

    但一般来说,您无法保证 E2 会被计算,因此为 E2 中的任何变量赋值确实是不安全的。

    我试图按照erl_parse中表达式的解析,但我不能说这种行为是不是故意的。

    【讨论】:

      【解决方案2】:

      这听起来像是 Erlang 求值器中的一个错误。编译器实际上拒绝让它通过。编译:

      -module(t).
      -compile(export_all).
      
      main() ->
          ((Var1 = 13) == 13) andalso ((Var2 = 12) == 13),
          {Var1,
           Var2}.
      

      产量:

      t.erl:7: 'andalso' 中的变量 'Var2' 不安全(第 5 行)

      这告诉您,如果左侧表达式失败,代码将无法按预期执行。

      shell 让它通过意味着运行在那里的评估器与编译器不匹配。可能值得通过 erlang-bugs 向 OTP 团队报告。

      【讨论】:

      • 有趣的问题。我认为这是在范围区域内。即,由于仅在必要时才检查下一个参数,因此从外部看不到其中的变量。所以这不是一个错误。例如,这一行证实了这一点:A = true andalso (((R = 18) == 18) andalso R ==18)。
      • @Atomic_alarm 如果是范围问题,那么它应该同时应用于 Var1Var2
      • 这是一个错误,因为编译器不接受它为有效,但评估器接​​受。两者在理想情况下应该是一样的。
      • @IGIVETERRIBLEADVICE ,所以它们的工作方式相同,不是吗?编译器发出错误,也作为评估者。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多