La maggior parte dei linguaggi di programmazione (sia linguaggi dinamici che statici) hanno parole chiave e / o sintassi speciali che sembrano molto diverse dalla dichiarazione delle variabili per la dichiarazione delle funzioni. Vedo le funzioni come dichiarare un'altra entità denominata:
Ad esempio in Python:
x = 2
y = addOne(x)
def addOne(number):
return number + 1
Perchè no:
x = 2
y = addOne(x)
addOne = (number) =>
return number + 1
Allo stesso modo, in una lingua come Java:
int x = 2;
int y = addOne(x);
int addOne(int x) {
return x + 1;
}
Perchè no:
int x = 2;
int y = addOne(x);
(int => int) addOne = (x) => {
return x + 1;
}
Questa sintassi sembra un modo più naturale di dichiarare qualcosa (sia esso una funzione o una variabile) e una parola chiave in meno come def
o function
in alcune lingue. E, IMO, è più coerente (guardo nello stesso posto per capire il tipo di una variabile o funzione) e probabilmente rende il parser / grammatica un po 'più semplice da scrivere.
So che pochissimi linguaggi usano questa idea (CoffeeScript, Haskell) ma i linguaggi più comuni hanno una sintassi speciale per le funzioni (Java, C ++, Python, JavaScript, C #, PHP, Ruby).
Anche in Scala, che supporta entrambi i modi (e ha l'inferenza del tipo), è più comune scrivere:
def addOne(x: Int) = x + 1
Piuttosto che:
val addOne = (x: Int) => x + 1
IMO, almeno a Scala, questa è probabilmente la versione più facilmente comprensibile ma questo idioma è raramente seguito:
val x: Int = 1
val y: Int = addOne(x)
val addOne: (Int => Int) = x => x + 1
Sto lavorando sul mio linguaggio giocattolo e mi chiedo se ci sono delle insidie se progetto la mia lingua in modo tale e se ci sono ragioni storiche o tecniche questo modello non è ampiamente seguito?
(int => int) addOne = (x) => {
è molto più "speciale" e "complesso" di int addOne(int) {
...