我是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 ?
答案 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中解析表达式,但是我不能说这个行为是否是故意的。