Erlang “评估”;“而且”;论据

Erlang “评估”;“而且”;论据,erlang,boolean-expression,short-circuiting,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?这听起来像是Erlang evaluator中的错误。编译器实际上拒绝让它通过。汇编此文件: -module(t). -compile(exp

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

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

main() ->
    ((Var1 = 13) == 13) andalso ((Var2 = 12) == 13),
    {Var1,
     Var2}.
收益率:

t、 erl:7:andalso中的变量“Var2”不安全(第5行)

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


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

这听起来像是Erlang evaluator中的一个bug。编译器实际上拒绝让它通过。汇编此文件:

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

main() ->
    ((Var1 = 13) == 13) andalso ((Var2 = 12) == 13),
    {Var1,
     Var2}.
收益率:

t、 erl:7:andalso中的变量“Var2”不安全(第5行)

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


shell让它通过意味着在那里运行的计算器与编译器不匹配。可能值得向OTP团队报告。E1和E2(我认为是R13)相当于

case E1 of
    false -> false;
    _ -> E2
end;
与这个定义相比,我同意在您的情况下Var2应该是有界的

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


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

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

case E1 of
    false -> false;
    _ -> E2
end;
与这个定义相比,我同意在您的情况下Var2应该是有界的

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


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

有趣的问题。我认为这是在范围领域。也就是说,由于下一个参数只有在必要时才被检查,因此从外部看不到其中的变量。所以这不是一个bug。例如,这行代码证实了这一点:A=true andalso(((R=18)==18)andalso R==18)。@Atomic_alarm如果这是一个范围问题,那么它应该同时应用于Var1和Var2?看起来编译器不允许在
{Var1,Var2}
中使用
Var2
,但是它本身允许
((Var1=13)==13)和((Var2=12)==13)
,就像shell计算器一样。这是一个错误,因为编译器不接受它为有效,但计算器接受它。在理想情况下,两者都应该起同样的作用。@igi,这是一种恶习,所以它们起同样的作用,不是吗?编译器发出一个错误,也作为计算器。有趣的问题。我认为这是在范围领域。也就是说,由于下一个参数只有在必要时才被检查,因此从外部看不到其中的变量。所以这不是一个bug。例如,这行代码证实了这一点:A=true andalso(((R=18)==18)andalso R==18)。@Atomic_alarm如果这是一个范围问题,那么它应该同时应用于Var1和Var2?看起来编译器不允许在
{Var1,Var2}
中使用
Var2
,但是它本身允许
((Var1=13)==13)和((Var2=12)==13)
,就像shell计算器一样。这是一个错误,因为编译器不接受它为有效,但计算器接受它。在理想情况下,两者都应该起同样的作用。@igi,这是一种恶习,所以它们起同样的作用,不是吗?编译器发出一个错误,也作为计算器。