Una caratteristica che mi manca dai linguaggi funzionali è l'idea che gli operatori siano solo funzioni, quindi aggiungere un operatore personalizzato è spesso semplice come aggiungere una funzione. Molti linguaggi procedurali consentono il sovraccarico dell'operatore, quindi in un certo senso gli operatori sono ancora funzioni (questo è molto vero in D dove l'operatore è passato come una stringa in un parametro template).
Sembra che laddove sia consentito il sovraccarico dell'operatore, è spesso banale aggiungere operatori addizionali personalizzati. Ho trovato questo post del blog , che sostiene che gli operatori personalizzati non funzionano bene con la notazione infisso a causa delle regole di precedenza, ma l'autore fornisce diverse soluzioni a questo problema.
Mi sono guardato intorno e non sono riuscito a trovare alcun linguaggio procedurale che supporti gli operatori personalizzati nella lingua. Ci sono degli hack (come i macro in C ++), ma questo è quasi lo stesso del supporto linguistico.
Poiché questa funzione è piuttosto semplice da implementare, perché non è più comune?
Capisco che possa portare a qualche brutto codice, ma che in passato non ha impedito ai progettisti di linguaggi di aggiungere funzionalità utili che possono essere facilmente abusate (macro, operatore ternario, puntatori non sicuri).
Casi di utilizzo effettivi:
- Implementa gli operatori mancanti (ad esempio, Lua non ha operatori bit a bit)
- Mimica%
~
(concatenazione di array) - DSL
- Usa
|
come zucchero sintassi stile pipe Unix (usando coroutine / generatori)
Mi interessano anche le lingue che do consentono agli operatori personalizzati, ma sono più interessato a perché è stato escluso. Ho pensato di creare un linguaggio di scripting per aggiungere operatori definiti dall'utente, ma mi sono fermato quando ho capito che non l'ho visto da nessuna parte, quindi c'è probabilmente una buona ragione per cui i progettisti di linguaggi più intelligenti di me non l'hanno permesso.