55 votes

En Erlang, quand dois-je utiliser ; ou , ou . ?

J'ai essayé d'apprendre Erlang et j'ai rencontré quelques problèmes avec les fins de lignes dans les fonctions et les case déclarations.

Quand dois-je utiliser un point-virgule ( ; ), la virgule ( , ), ou période à l'intérieur de mes fonctions ou case déclarations ?

57voto

cthulahoops Points 2626

J'aime lire le point-virgule comme OR, la virgule comme AND, le point comme END. Donc

foo(X) when X > 0; X < 7 ->
    Y = X * 2,
    case Y of
        12 -> bar;
        _  -> ook
    end;
foo(0) -> zero.

se lit comme suit

foo(X) when X > 0 *OR* X < 7 ->
    Y = X * 2 *AND*
    case Y of
        12 -> bar *OR*
        _  -> ok
    end *OR*
foo(0) -> zero *END*

Cela devrait permettre de comprendre pourquoi il n'y a pas de ; après la dernière clause d'une affaire.

2 votes

Je débute avec Erlang et ceci m'a été extrêmement utile. Je vous remercie.

2 votes

Bon exemple, mais quand est-ce que X > 0; X < 7 jamais être fausse ?

0 votes

Méthode très utile, très naturelle.

56voto

marcc Points 8513

Virgule à la fin d'une ligne de code normale.
Point-virgule à la fin de l'instruction case, ou if, etc. La dernière instruction case ou if n'a rien à la fin. Un point à la fin d'une fonction.

exemple (désolé pour les noms de variables aléatoires, il est clair que cela ne sert à rien, mais illustre un point) :

case Something of 
    ok ->
        R = 1,     %% comma, end of a line inside a case 
        T = 2;     %% semi colon, end of a case, but not the end of the last
    error ->
        P = 1,     %% comma, end of a line inside a case
        M = 2      %% nothing, end of the last case
end.               %% period, assuming this is the end of the function, comma if not the end of the function

4 votes

On utilise également le point-virgule à la fin d'une clause de fonction qui ne termine pas la fonction (on termine une fonction en utilisant un point, comme l'a expliqué marcc).

0 votes

Vous terminez une fonction nommée par un point. Les fonctions anonymes se terminent par un mot-clé end. Vous utilisez également des points après les directives -include() et -compiler. Il est préférable de considérer le point comme un terminateur final. C'est la "FIN", alors que la virgule et le point-virgule sont des séparateurs. Comme le dit chthulahoops ci-dessous. la virgule fonctionne comme séparateur d'une série, et le point-virgule fonctionne comme séparateur d'alternatives. Le point-virgule, = et & ; = ou est une façon assez décente de s'en souvenir.

29voto

Jamie Forrest Points 2145

Période (.)

Dans les modules, le point est utilisé pour terminer les attributs de module et les déclarations de fonctions (alias "formulaires"). Vous pouvez vous en souvenir parce que les formulaires ne sont pas des expressions (aucune valeur n'est renvoyée par eux), et donc le point représente la fin d'une déclaration.

Gardez à l'esprit que les définitions de fonctions ayant des ariés différents sont considérées comme des déclarations distinctes, et que chacune d'entre elles doit être terminée par un point.

Par exemple, les définitions des fonctions pour hello/0 et hello/1:

hello() -> hello_world.

hello(Greeting) -> Greeting.

(Notez que dans le shell erlang, le point est utilisé pour terminer et évaluer les expressions, mais c'est une anomalie).

Point-virgule ( ;)

Le point-virgule sert de séparateur de clause, à la fois pour les clauses de fonction et les branches d'expression.

Exemple 1, clauses de fonction :

factorial(0) -> 1;
factorial(N) -> N * fac(N-1).

Exemple 2, branches d'expression :

if X < 0  -> negative;
   X > 0  -> positive;
   X == 0 -> zero
end

Virgule (,)

La virgule est un séparateur d'expression. Si une virgule suit une expression, cela signifie qu'il y a une autre expression après elle dans la clause.

hello(Greeting, Name) -> 
    FullGreeting = Greeting ++ ", " ++ Name,
    FullGreeting.

0 votes

Oui, une chose qui m'a fait tiquer quand j'ai appris erlang était de mettre le ; à la fin de la dernière clause, par exemple après votre X == 0 -> zero dans l'exemple 2.

3voto

Ben Hughes Points 8238

Vous pouvez y penser comme à une ponctuation anglaise. Les virgules sont utilisées pour séparer les éléments d'une série, les points-virgules sont utilisés pour séparer deux clauses indépendantes très proches[1] (par exemple, les différents cas de l'instruction case, les clauses de fonction de même nom et de même arité qui correspondent à des modèles différents), et les points sont utilisés pour terminer une phrase (pensée complète).

  1. Ou pour prouver que tu es allé à l'université. "N'utilisez pas de points-virgules. Ce sont des hermaphrodites travestis qui ne représentent absolument rien. Tout ce qu'ils font, c'est montrer que vous êtes allé à l'université." -- Kurt Vonnegut

2 votes

J'adore la citation de Vonnegut ! Je m'assurerai d'accentuer mon utilisation des points-virgules ; ils devraient vraiment être utilisés davantage.

0 votes

+1. La ponctuation d'Erlang est clairement inspirée de la ponctuation de la prose, au détriment d'Erlang .

3voto

rvirding Points 13019

La virgule sépare les expressions, ou les arguments, ou les éléments d'une liste/tuple ou binaire. Elle est galvaudée.

0 votes

Je suppose que vous approuveriez LFE comme une solution à ce problème, sauf que il n'a pas été touché depuis un an . Reia est défunt . Efene n'a pas été touché depuis 7 mois, et le " 1.0 dernier appel "a été répondu par des grillons il y a 15 mois. Parmi les langages compilés vers BEAM, seul Élixir semble être encore en cours de développement.

0 votes

@WarrenYoung Étant donné que j'étais l'une des personnes à l'origine de la syntaxe Erlang, je n'ai pas vraiment de problèmes avec elle :-) LFE n'est pas mort, il a juste atteint le stade où il a besoin d'utilisateurs sérieux pour obtenir des contributions pour les améliorations et le développement. Une syntaxe lisp alternative pour Erlang est Joxa. Personnellement, je ne vois pas le charme d'une syntaxe de type ruby.

0 votes

Oui, je sais qui vous êtes. ("Bonjour, Robert !") Je me disais simplement que si vous aviez la possibilité de tout recommencer, vous ne baseriez peut-être pas la syntaxe de votre nouveau langage sur celle de Prolog cette fois-ci. Quant à LFE, Lisp a ~1% de part d'esprit et Erlang ~1/3%. donc le potentiel maximum de mindshare de LFE est de ~0.0033%. Son site probablement Le potentiel est encore réduit par la fraction des utilisateurs du système Erlang qui sont prêts à utiliser un front-end secondaire pour commencer. N'aimez pas Ruby si vous voulez, mais ce langage et les langages similaires sont plus populaires en ce moment.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X