Je modélise un langage de programmation pour le plaisir, et la syntaxe est fortement influencée par Scala - en particulier les définitions de fonction.
J'ai rencontré un problème de conception car mon langage ne fait pas de distinction entre les fonctions définies via la def
syntaxe (méthodes de classe) et les fonctions anonymes affectées aux valeurs (créées à l'aide =>
) - il supprime les différences d' implémentation et de comportement .
Le résultat est que les deux définitions suivantes signifient la même chose:
def square(x: Int) = x*x
val square = (x: Int) => x*x
Il n'y a aucune raison d'utiliser ce dernier formulaire (affectation de fonction anonyme immédiate) dans toute situation normale - il est simplement possible de l'utiliser à la place du def
formulaire.
Une telle syntaxe en double pour définir des fonctions nommées nuirait-elle à l'orthogonalité du langage ou à un autre aspect de la conception?
Je préfère cette solution car elle permet des définitions courtes et intuitives des méthodes et des fonctions nommées (via def
), et des définitions courtes des fonctions anonymes (via =>
).
Edit: Scala fait la différence entre les deux - les fonctions anonymes ne sont pas les mêmes que les méthodes définies avec def
Scala. Les différences sont cependant relativement subtiles - voir les articles que j'ai liés auparavant.
val
notation?
fun
pour définir une fonction récursive.
def
fait. C'est juste un effet secondaire du fait qu'une fonction anonyme, disons (x : Int) => x + 1
est un objet, et que les objets peuvent être affectés à des valeurs avec val f = ...
. Les concepteurs de langage auraient dû faire tout leur possible pour interdire la syntaxe. Ce n'est pas tout à fait la même chose que de faire explicitement l'effort de prendre en charge deux syntaxes différentes qui font (approximativement) la même chose.
However, assigning existing functions
semble manquer la fin de la phrase