2012-10-25 3 views
7

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?

+1

Sur Erlang R15B01 je reçois '{true, true}' dans '6 > '. –

+0

R15B02 a '{true, true}' dans '6 >' ici aussi. – halfelf

+0

Sur R14B02 '{true, true}' dans la ligne '6>', aussi. – Tilman

Répondre

3

La différence entre l'évaluation 2 dans la coque provient de la ligne vide 6>. Si vous regardez le fun en utilisant la fonction erlang: fun_info/1, vous verrez que dans ce cas, la clause est stockée avec un nombre différent (ie 2 au lieu de 1).

Si vous entrez à nouveau la définition de Y (sans ligne vide), vous obtiendrez une mauvaise correspondance, si vous entrez une ligne vide avant, c'est OK.

Je pense que c'est un effet secondaire de l'utilisation du shell, mais que le comportement est cohérent dans un programme. Bien sûr, le sens de> ou < n'est pas évident pour un amusement, mais == oui. Une bonne chose est que l'ordre terme Erlang est défini, il est donc possible de trier une liste de tout terme avec un comportement prévisible:

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

Je suppose que '==' n'est utile que pour comparer des nombres. – halfelf

+3

@ halfelf Non, '==' est utile pour comparer tout et n'importe quoi. Vous devriez juste être conscient de la sémantique de la comparaison. Je ne comparerais pas sérieusement les fonctions, il y a juste trop de façons dont les fonctions «égales» peuvent être inégales. Par exemple, si vous vous attendez à comparer les AST, sachez que l'AST contient des numéros de ligne. – rvirding