В функциональных языках мне не хватает функции, заключающейся в том, что операторы - это просто функции, поэтому добавить пользовательский оператор часто так же просто, как добавить функцию. Многие процедурные языки допускают перегрузки операторов, поэтому в некотором смысле операторы все еще являются функциями (это очень верно в D, где оператор передается в виде строки в параметре шаблона).
Кажется, что там, где допустима перегрузка операторов, часто бывает просто добавить дополнительные пользовательские операторы. Я нашел этот пост в блоге , в котором утверждается, что пользовательские операторы плохо работают с инфиксной нотацией из-за правил приоритета, но автор дает несколько решений этой проблемы.
Я огляделся и не смог найти процедурных языков, которые бы поддерживали пользовательские операторы на этом языке. Есть хаки (такие как макросы в C ++), но это не то же самое, что поддержка языка.
Поскольку эту функцию довольно просто реализовать, почему она не является более распространенной?
Я понимаю, что это может привести к некоторому уродливому коду, но это не мешало разработчикам языков в прошлом добавлять полезные функции, которыми можно легко злоупотреблять (макросы, троичные операторы, небезопасные указатели).
Фактические варианты использования:
- Реализовать пропущенные операторы (например, Lua не имеет побитовых операторов)
- Mimic D's
~
(конкатенация массивов) - DSL,
- Использовать
|
как синтаксический сахар в стиле конвейера Unix (используя сопрограммы / генераторы)
Я также заинтересован в языках , которые делают позволяют пользовательские операторы, но я больше заинтересован в почему она была исключена. Я думал о разветвлении языка сценариев для добавления пользовательских операторов, но остановился, когда понял, что нигде его не видел, так что, вероятно, есть веская причина, почему разработчики языка умнее меня не допустили этого.