La plupart des langages de programmation (à la fois typés dynamiquement et statiquement) ont des mots-clés et / ou une syntaxe spéciaux qui ont une apparence très différente de la déclaration de variables pour la déclaration de fonctions. Je vois les fonctions comme déclarant simplement une autre entité nommée:
Par exemple en Python:
x = 2
y = addOne(x)
def addOne(number):
return number + 1
Pourquoi pas:
x = 2
y = addOne(x)
addOne = (number) =>
return number + 1
De même, dans un langage comme Java:
int x = 2;
int y = addOne(x);
int addOne(int x) {
return x + 1;
}
Pourquoi pas:
int x = 2;
int y = addOne(x);
(int => int) addOne = (x) => {
return x + 1;
}
Cette syntaxe semble une manière plus naturelle de déclarer quelque chose (que ce soit une fonction ou une variable) et un mot-clé de moins comme def
ou function
dans certaines langues. Et, IMO, il est plus cohérent (je regarde au même endroit pour comprendre le type d’une variable ou d’une fonction) et rend probablement l’analyseur / la grammaire un peu plus simple à écrire.
Je sais que très peu de langages utilisent cette idée (CoffeeScript, Haskell), mais la plupart des langages ont une syntaxe spéciale pour les fonctions (Java, C ++, Python, JavaScript, C #, PHP, Ruby).
Même en Scala, qui prend en charge les deux méthodes (et comporte une inférence de type), il est plus courant d'écrire:
def addOne(x: Int) = x + 1
Plutôt que:
val addOne = (x: Int) => x + 1
OMI, au moins à Scala, c'est probablement la version la plus compréhensible, mais cet idiome est rarement suivi:
val x: Int = 1
val y: Int = addOne(x)
val addOne: (Int => Int) = x => x + 1
Je travaille sur mon propre langage des jouets et je me demande s’il existe des pièges si je conçois mon langage de cette manière et s’il existe des raisons historiques ou techniques pour lesquelles ce modèle n’est pas largement suivi?
(int => int) addOne = (x) => {
c'est beaucoup plus "spécial" et "complexe" que int addOne(int) {
...