Che cosa significa per confrontare le funzioni in Erlang con gli operatori =:=
, ==
, <
, >
, =<
, >=
? Stavo giocando con l'interprete e ho ottenuto questi risultati:uguaglianza Funzione/ordinare in 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}
Questo ha senso. Sembra che stia confrontando l'albero sintattico astratto delle due funzioni.
Ma in questa sessione X
e Y
vengono definiti gli stessi ancora una volta ma sono diversi, anche ora 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}
così sembra che non sta confrontando l'AST o qualsiasi tipo di riferimenti unici. Forse sta comparando i riferimenti, solo qualche ottimizzazione sta accadendo e X
e Y
si legano allo stesso riferimento? Se c'è qualche spiegazione per questo, cosa succede tra diverse VM o diversi nodi?
Su Erlang R15B01 ottengo '{true, true}' a '6 > '. –
R15B02 ha ottenuto '{true, true}' in '6>' anche qui. – halfelf
Su R14B02 '{true, true}' nella riga '6>', anche. – Tilman