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 defsintassi (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 defmodulo.
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 defa Scala. Le differenze sono tuttavia relativamente sottili: vedi i post che ho collegato prima.
valnotazione?
funper 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 functionssembra mancare la fine della frase