评估“andalso”论点

时间:2015-06-26 03:18:49

标签: erlang boolean-expression short-circuiting

我是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

2 个答案:

答案 0 :(得分:0)

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

-module(t).
-compile(export_all).

main() ->
    ((Var1 = 13) == 13) andalso ((Var2 = 12) == 13),
    {Var1,
     Var2}.

收率:

  

t.erl:7:变量' Var2'不安全的'以及#39; (第5行)

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

shell允许它通过意味着在那里运行的求值程序与编译器没有正确匹配。可能值得在erlang-bugs向OTP小组报告。

答案 1 :(得分:0)

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

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

与此定义相比,我同意Var2应该在您的情况下有界。

但总的来说,您无法保证会对E2进行评估,因此为E2中的任何变量赋值都是不安全的。

我试着在erl_parse中解析表达式,但是我不能说这个行为是否是故意的。