Una caratteristica che mi manca nei 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 sovraccarichi degli operatori, quindi in un certo senso gli operatori sono ancora funzioni (questo è molto vero in D dove l'operatore viene passato come stringa in un parametro modello).
Sembra che laddove sia consentito il sovraccarico degli operatori, spesso sia banale aggiungere altri operatori personalizzati. Ho trovato questo post sul blog , in cui si afferma che gli operatori personalizzati non funzionano bene con la notazione infissa a causa delle regole di precedenza, ma l'autore offre diverse soluzioni a questo problema.
Mi sono guardato intorno e non sono riuscito a trovare linguaggi procedurali che supportino operatori personalizzati nella lingua. Ci sono hack (come le macro in C ++), ma non è lo stesso del supporto del linguaggio.
Poiché questa funzionalità è piuttosto banale da implementare, perché non è più comune?
Capisco che può portare a qualche brutto codice, ma che in passato non ha impedito ai progettisti di linguaggi di aggiungere funzioni utili che possono essere facilmente abusate (macro, operatore ternario, puntatori non sicuri).
Casi d'uso reali:
- Implementa operatori mancanti (ad es. Lua non ha operatori bit a bit)
- Mimic D's
~
(concatenazione di array) - DSL
- Utilizzare
|
come zucchero di sintassi tipo pipe Unix (usando coroutine / generatori)
Sono anche interessato a lingue che fanno consentire agli operatori personalizzati, ma io sono più interessato a perché essa è stata esclusa. Ho pensato di creare un linguaggio di scripting per aggiungere operatori definiti dall'utente, ma mi sono fermato quando mi sono reso conto di non averlo visto da nessuna parte, quindi probabilmente c'è una buona ragione per cui i progettisti di lingue più intelligenti di me non l'hanno permesso.