Qu'est-ce que cela signifie pour comparer les fonctions en Erlang avec les opérateurs =:=
, ==
, <
, >
, =<
, >=
? Je jouais avec l'interprète et obtenu ces résultats:Fonction égalité/commande en 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}
Cela a du sens. On dirait qu'il compare l'arbre de syntaxe abstraite des deux fonctions.
Mais dans cette session X
et Y
sont définis de nouveau les mêmes mais sont différents, aussi maintenant 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}
Il semble donc que ce n'est pas comparer l'AST ou toute sorte de références uniques. Peut-être qu'il s'agit de comparer des références, juste une certaine optimisation est en cours et X
et Y
être lié à la même référence? S'il y a une explication à cela, que se passe-t-il entre différentes machines virtuelles ou différents nœuds?
Sur Erlang R15B01 je reçois '{true, true}' dans '6 > '. –
R15B02 a '{true, true}' dans '6 >' ici aussi. – halfelf
Sur R14B02 '{true, true}' dans la ligne '6>', aussi. – Tilman