2012-10-25 20 views
7

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?

+1

Na Erlang R15B01 uzyskać '{true, true}' w '6 > '. –

+0

R15B02 również otrzymało '{true, true}' w '6>'. – halfelf

+0

Na R14B02 '{true, true}' w linii '6>' również. – Tilman

Odpowiedz

3

Różnica między 2 ocenami w powłoce pochodzi z pustej linii 6>. jeśli spojrzysz na zabawę za pomocą funkcji erlang: fun_info/1, zobaczysz, że w takim przypadku klauzula jest przechowywana z innym numerem (tj. 2 zamiast 1).

Jeśli ponownie wprowadzisz definicję Y (bez pustej linii), otrzymasz złe dopasowanie, jeśli wcześniej wprowadzisz pustą linię, wszystko będzie w porządku.

Myślę, że jest to efekt uboczny używania powłoki, ale zachowanie to jest zgodne z programem. Oczywiście znaczenie> lub < nie jest oczywiste dla zabawy, ale == tak. Ładny rzeczą jest również, że kolejność Erlang definicją, jest więc możliwe, aby posortować listę jakiegokolwiek warunku z przewidywalnym zachowaniem:

number < atom < reference < fun < port < pid < tuple < list < bit string 
+0

Domyślam się, że "==" jest przydatne tylko przy porównywaniu liczb. – halfelf

+3

@halfelf Nie, '==' jest przydatne do porównywania czegokolwiek i wszystkiego. Powinieneś być świadomy semantyki porównania. Nie porównałbym poważnie funkcji, jest zbyt wiele sposobów, w których "równe" funkcje mogą być nierówne. Na przykład, jeśli spodziewasz się, że porówna on AST, należy pamiętać, że AST zawiera numery linii. – rvirding