=:=
将 Erlang 中的函数与运算符, ==
, <
, >
, =<
,进行比较是什么意思>=
?
我正在和解释器一起玩,得到了这些结果:
Eshell V5.9.2 (abort with ^G)
1> X = fun() -> {} end.
#Fun<erl_eval.20.82930912>
2> Y = fun() -> {} end.
#Fun<erl_eval.20.82930912>
3>
3> {X == X, X =:= X}.
{true,true}
4> {X >= X, X =< X}.
{true,true}
5> {X > X, X < X}.
{false,false}
6>
6> {X == Y, X =:= Y}.
{true,true}
7> {X >= Y, X =< Y}.
{true,true}
8> {X > Y, X < Y}.
{false,false}
这是有道理的。它看起来像是在比较两个函数的抽象语法树。
但是在本次会议中X
,Y
再次定义相同但不同,现在也一样X<Y
吗?
Eshell V5.9.2 (abort with ^G)
1> X = fun() -> {} end.
#Fun<erl_eval.20.82930912>
2>
2> {X == X, X =:= X}.
{true,true}
3> {X >= X, X =< X}.
{true,true}
4> {X > X, X < X}.
{false,false}
5>
5> Y = fun() -> {} end.
#Fun<erl_eval.20.82930912>
6>
6> {X == Y, X =:= Y}.
{false,false}
7> {X >= Y, X =< Y}.
{false,true}
8> {X > Y, X < Y}.
{false,true}
所以看起来它没有比较 AST或任何类型的唯一引用。也许它正在比较参考,只是一些优化正在发生并X
绑定Y
到相同的参考?如果对此有一些解释,不同的虚拟机或不同的节点会发生什么?