2012-10-25 16 views
7

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?

+1

Su Erlang R15B01 ottengo '{true, true}' a '6 > '. –

+0

R15B02 ha ottenuto '{true, true}' in '6>' anche qui. – halfelf

+0

Su R14B02 '{true, true}' nella riga '6>', anche. – Tilman

risposta

3

La differenza tra la valutazione 2 nella shell proviene dalla riga vuota 6>. se dai un'occhiata al divertimento usando la funzione erlang: fun_info/1, vedrai che in quel caso la clausola è memorizzata con un numero diverso (cioè 2 invece di 1).

Se si immette nuovamente la definizione di Y (senza una riga vuota) si otterrà una corrispondenza errata, se si inserisce una riga vuota prima, è OK.

Penso che questo sia un effetto collaterale dell'utilizzo della shell, ma che il comportamento sia coerente all'interno di un programma. Ovviamente il significato di> o < non è ovvio per un divertimento, ma == sì. Una cosa bella è anche che l'ordine del termine Erlang è definito, quindi è possibile ordinare un elenco di qualsiasi termine con un comportamento prevedibile:

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

Immagino che '==' sia utile solo quando si confrontano i numeri. – halfelf

+3

@halfelf No, '==' è utile per confrontare qualsiasi cosa. Dovresti solo essere consapevole della semantica del confronto. Non vorrei seriamente confrontare le funzioni, ci sono troppi modi in cui le funzioni "uguali" possono essere diseguali. Ad esempio, se si prevede di confrontare gli AST, tenere presente che l'AST contiene numeri di riga. – rvirding