Um recurso que sinto falta das linguagens funcionais é a ideia de que os operadores são apenas funções; portanto, adicionar um operador personalizado é tão simples quanto adicionar uma função. Muitas linguagens procedurais permitem sobrecargas do operador, portanto, em certo sentido, os operadores ainda são funções (isso é verdade em D, onde o operador é passado como uma string em um parâmetro de modelo).
Parece que onde a sobrecarga do operador é permitida, geralmente é trivial adicionar operadores personalizados adicionais. Encontrei este post no blog , que argumenta que os operadores personalizados não funcionam bem com a notação infix por causa das regras de precedência, mas o autor fornece várias soluções para esse problema.
Olhei em volta e não consegui encontrar nenhuma linguagem processual que suporte operadores personalizados na linguagem. Existem hacks (como macros em C ++), mas isso não é o mesmo que o suporte a idiomas.
Como esse recurso é bastante trivial de implementar, por que não é mais comum?
Eu entendo que isso pode levar a algum código feio, mas isso não impediu os designers de linguagem de adicionar recursos úteis que podem ser facilmente abusados (macros, operador ternário, ponteiros inseguros).
Casos de uso reais:
- Implementar operadores ausentes (por exemplo, Lua não possui operadores bit a bit)
- Imitar D's
~
(concatenação de matriz) - DSLs
- Use
|
como açúcar de sintaxe no estilo de canal Unix (usando coroutines / geradores)
Eu também estou interessado em idiomas que fazer permitir que os operadores de costume, mas eu estou mais interessado em por que ele foi excluído. Pensei em criar uma linguagem de script para adicionar operadores definidos pelo usuário, mas me parei quando percebi que não a havia visto em nenhum lugar; portanto, provavelmente há uma boa razão pela qual designers de linguagem mais inteligentes do que eu não o permitiram.