• [^] # Re: Erlang

    Posté par . En réponse à la dépêche Apprendre un langage de programmation par an. Évalué à 1.

    Ton argumentation me rend perplexe. J'ai l'impression que tu dis qu'Erlang n'est pas un langage fonctionnel, puisqu'il ne permet pas de créer des fonctions locales, et que la syntaxe "fun" est juste du sucre syntaxique proche d'une fonction pour autre chose de moins expressif (moins expressif puisqu'on n'envisage pas d'y ajouter la récursion).
    Dans ce cas, Erlang n'est pas satisfaisant du tout en tant que langage fonctionnel (un langage fonctionnel sans fonctions locales, c'est presque de la publicité mensongère).

    En même temps, ton discours "tu peux l'utiliser où tu veux dans ton code, le passer en paramètre ..." est exactement celui que l'on utilise pour décrire des fonctions de première classe. Des fonctions quoi.

    Ensuite tu dis que de toute façon, ces trucs là sont très peu utilisés en Erlang, ce n'est pas idiomatique de s'en servir. Très bien (tant mieux pour vous les programmeurs Erlang, qui n'êtes pas dérangé par cette limitation), mais peut-être que si la syntaxe était mieux pensée sur ce point, les gens pourraient s'en servir de temps en temps.

    Je ne sais pas quel est le problème que tu cherches à résoudre.

    Un exemple serait plus parlant. Imagine que j'ai une fonction Erlang un peu grosse, qui définit une fonction locale (parce que cette fonction utilise des variables définies plus haut dans le bloc, et qu'elle n'a de sens que dans ce contexte donc polluerait inutilement le niveau global).

    (Désolé pour l'indentation, je ne sais pas comment faire simplement avec le markup LinuxFR)

    truc(args) ->
    ...
    F = fun(N) ->
    N * (N + 1) / 2
    end,
    ...


    Maintenant il se trouve que ma spécification change un peu, et j'ai besoin d'utiliser non pas (1 + 2 + .. + n) mais (1 * 2 * .. * n). J'ai envie d'écrire :


    truc(args) ->
    ...
    F = fun(N) ->
    if
    N > 1 -> N * F(N-1)
    true -> 1
    end
    end,
    ...


    Mais je ne peux pas, car `F` n'est pas définie dans le corps de la fonction.

    J'aimerais avoir une syntaxe pour faire ça, par exemple :

    F = fix Fac(N) ->
    if
    N > 1 -> N * Fac(N-1)
    true -> 1
    end
    end