评估 "andalso" 个参数

Evaluation of "andalso" arguments

我是 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 求值器中的错误。编译器实际上拒绝让它通过。编译:

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

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

产量:

t.erl:7: variable 'Var2' unsafe in 'andalso' (line 5)

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

shell 让它通过意味着那里的求值器 运行 没有正确匹配编译器。可能值得在 erlang-bugs.

向 OTP 团队报告

E1 andalso E2(我认为是因为 R13)等同于

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

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

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

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