Sto creando un linguaggio di programmazione come hobby, ma ho riscontrato un problema con la progettazione della sua sintassi. Il problema è il conflitto tra la sintassi per definire le funzioni dell'argomento zero e la sintassi per le operazioni di riassegnazione. La sintassi della definizione della funzione è presa da Haskell e assomiglia a questo:
name arguments = expression
Una funzione a zero argomenti avrebbe ovviamente questa forma: name = expression
. Tuttavia, ciò pone un problema perché, senza contesto, il programmatore potrebbe confondere tale definizione con un'operazione di riassegnazione (che ha la stessa forma, variable = expression
).
La mia soluzione è semplice: vietare le funzioni con argomenti zero. Più precisamente, tali funzioni assumono ora un singolo valore del tipo di unità come argomento. Questo è ispirato da Scala, in cui funzioni che "non restituiscono nulla", in realtà restituiscono ()
(di tipo Unit
), che è un tipo con un solo valore possibile che non contiene informazioni utili.
La definizione sarebbe quindi simile a questa:
name () = expression
E una chiamata dovrebbe avere la forma name ()
- nota che '()' non è un elenco di parametri, ma piuttosto il valore di tipo Unit
. La definizione di cui sopra si basa sulla corrispondenza del modello, come () non è il nome dell'argomento, ma l'unica forma che può assumere.
La mia domanda è se una tale decisione progettuale abbia senso teorico e se abbia alcuni effetti negativi pratici ?