Co to znaczy, aby porównać funkcje Erlang z operatorami =:=
, ==
, <
, >
, =<
, >=
? Grałem z tłumaczem i otrzymałem następujące wyniki:równość Funkcja/zamawiania w 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}
Ma to sens. Wygląda na to, że porównuje abstrakcyjne drzewo składniowe tych dwóch funkcji.
Ale w tej sesji X
i Y
są zdefiniowane tak samo raz jeszcze, ale są różne, również teraz 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}
Wygląda więc na to, że nie jest porównanie AST lub dowolny rodzaj unikalnych referencji. Może to porównanie odniesień, po prostu optymalizacja dzieje się i X
i Y
dostać się do tego samego odniesienia? Jeśli jest jakieś wyjaśnienie tego, co dzieje się w różnych maszynach wirtualnych lub w różnych węzłach?
Na Erlang R15B01 uzyskać '{true, true}' w '6 > '. –
R15B02 również otrzymało '{true, true}' w '6>'. – halfelf
Na R14B02 '{true, true}' w linii '6>' również. – Tilman