Una característica que echo de menos de los lenguajes funcionales es la idea de que los operadores son solo funciones, por lo que agregar un operador personalizado suele ser tan simple como agregar una función. Muchos lenguajes de procedimiento permiten sobrecargas de operadores, por lo que, en cierto sentido, los operadores siguen siendo funciones (esto es muy cierto en D donde el operador se pasa como una cadena en un parámetro de plantilla).
Parece que cuando se permite la sobrecarga de operadores, a menudo es trivial agregar operadores personalizados adicionales. Encontré esta publicación de blog , que sostiene que los operadores personalizados no funciona bien con la notación de infijo debido a las reglas de precedencia, pero el autor da varias soluciones a este problema.
Miré a mi alrededor y no pude encontrar ningún idioma de procedimiento que admita operadores personalizados en el idioma. Hay hacks (como macros en C ++), pero eso no es lo mismo que el soporte de idioma.
Dado que esta función es bastante trivial de implementar, ¿por qué no es más común?
Entiendo que puede llevar a algún código feo, pero eso no ha impedido a los diseñadores de idiomas en el pasado agregar funciones útiles que se pueden abusar fácilmente (macros, operador ternario, punteros no seguros).
Casos de uso reales:
- Implemente operadores que faltan (por ejemplo, Lua no tiene operadores bitwise)
-
~
(concatenación de matriz) de Mimic D - DSL
- Utilice
|
como azúcar de sintaxis de estilo de tubería de Unix (usando coroutines / generadores)
También me interesan los idiomas que permite permitir operadores personalizados, pero me interesa más por qué se ha excluido. Pensé en forzar un lenguaje de scripting para agregar operadores definidos por el usuario, pero me detuve cuando me di cuenta de que no lo había visto en ninguna parte, por lo que probablemente haya una buena razón por la que los diseñadores de idiomas más inteligentes que yo no lo han permitido.