Однією з особливостей, які мені не вистачає у функціональних мовах, є думка про те, що оператори - це лише функції, тому додавання спеціального оператора часто так само просто, як додавання функції. Багато процедурних мов дозволяють перевантажувати оператори, тому в деякому сенсі оператори все ще функціонують (це дуже вірно в D, коли оператор передається як рядок у параметрі шаблону).
Здається, що там, де дозволена перевантаження оператора, часто доцільно додавати додаткові спеціальні оператори. Я знайшов цю публікацію в блозі , яка стверджує, що користувацькі оператори не дуже добре працюють із позначенням інфіксації через правила пріоритетності, але автор дає декілька рішень цієї проблеми.
Я озирнувся і не зміг знайти жодної процедурної мови, яка б підтримувала власні оператори мовою. Є хаки (наприклад, макроси в C ++), але це навряд чи те саме, що мовна підтримка.
Оскільки ця функція є досить тривіальною у застосуванні, чому вона не частіша?
Я розумію, що це може призвести до деякого потворного коду, але це не зупиняло дизайнерів мови в минулому від додавання корисних функцій, які можна легко зловживати (макроси, потрійний оператор, небезпечні вказівники).
Фактичні випадки використання:
- Впровадити відсутні оператори (наприклад, у Lua немає побітових операторів)
- Міміка D
~
(об'єднання масивів) - DSL
- Використовувати
|
як синтаксис цукрового синтаксису в стилі Unix (використовуючи супровідні програми / генератори)
Мене також цікавлять мови, які дозволяють користувальницьким операторам, але мене більше цікавить, чому це було виключено. Я думав над тим, щоб змусити мову сценаріїв додати визначені користувачем оператори, але зупинився, коли зрозумів, що цього не бачив ніде, тому, мабуть, є вагома причина, чому дизайнери мови розумніші за мене не дозволили.