在 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
被绑定到同一个引用上?如果有一些解释,那么在不同的VM或不同的节点中会发生什么呢?
6>
中得到了{true, true}
。 - Roberto Aloi{true, true}
,在6>
。 - halfelf{true,true}
。 - Tilman