Sto modellando un linguaggio di programmazione per divertimento e la sintassi è fortemente influenzata da Scala, in particolare dalle definizioni delle funzioni.
Ho riscontrato un problema di progettazione perché il mio linguaggio non distingue tra funzioni definite tramite la def
sintassi (metodi di classe) e funzioni anonime assegnate ai valori (creati usando =>
) - rimuove le differenze sia nell'implementazione che nel comportamento .
Il risultato è che le seguenti due definizioni significano la stessa cosa:
def square(x: Int) = x*x
val square = (x: Int) => x*x
Non vi è alcun motivo per utilizzare quest'ultimo modulo (assegnazione immediata della funzione anonima) in qualsiasi situazione normale: è semplicemente possibile utilizzarlo al posto del def
modulo.
Avere una sintassi così duplicata per definire le funzioni con nome danneggerebbe l'ortogonalità del linguaggio o qualche altro aspetto del design?
Preferisco questa soluzione perché consente definizioni brevi e intuitive di metodi e funzioni denominate (via def
) e definizioni brevi di funzioni anonime (utilizzo =>
).
Edit: Scala fa distinguere tra i due - anonimo funzioni non sono le stesse di metodi definiti con def
a Scala. Le differenze sono tuttavia relativamente sottili: vedi i post che ho collegato prima.
val
notazione?
fun
per definire una funzione ricorsiva.
def
è. È solo un effetto collaterale del fatto che una funzione anonima, ad esempio, (x : Int) => x + 1
è un oggetto e gli oggetti possono essere assegnati a valori con val f = ...
. I progettisti linguistici avrebbero dovuto fare di tutto per impedire la sintassi. Non è esattamente lo stesso di impegnarsi esplicitamente per supportare due diverse sintassi che fanno (approssimativamente) la stessa cosa.
However, assigning existing functions
sembra mancare la fine della frase