2009-04-18 5 views
3

J'expérimente avec correspondance de motif de bits dans Erlang:Pourquoi aucun motif de bits dynamique dans l'argument de la fonction?

-module(test). 
-export([test/2]). 

%test(P,<<X:P,0:1>>) -> 
% X. 

test(P,X) -> 
    <<Y:P,0:1>> = X, 
    Y. 

lors de la compilation de la version commentée de test/2 que je reçois une plainte « variable « P » est non liée ». Y a-t-il une bonne raison de ne pas permettre à la première version de fonctionner comme la seconde?

Répondre

4

Parce que dans la mise en commentaire la version P est une longueur - pour que cela fonctionne Erlang aurait besoin d'effectuer un double match - correspondre à la valeur du 2ème paramètre avec un motif qui est non déterminé ...

La question vous demandez dans une clause de correspondance de modèle est "est-ce la clause pour moi" - vous ne pouvez pas "pop dans la clause" et puis revenir si ce n'est pas ...

Dans le deuxième exemple X est lié avant le match, vous êtes engagé à entrer dans la clause et si <<Y:P,0:1>> don't match X, bien temps de l'accident!

0

La raison est que les arguments de la fonction sont évalués indépendamment les uns des autres. L'exactitude des liaisons aux variables n'est vérifiée que dans un deuxième temps.

Cela signifie que dans votre premier exemple P ne sera pas lié lors de l'évaluation du second argument, ce qui va à l'encontre des règles de correspondance des modèles. En revanche, dans votre deuxième exemple, P est lié au moment de l'évaluation de la correspondance de motif sur le binaire.

Questions connexes