Jedną z funkcji, których mi brakuje w językach funkcjonalnych, jest pomysł, że operatory to tylko funkcje, więc dodanie operatora niestandardowego jest często tak proste, jak dodanie funkcji. Wiele języków proceduralnych pozwala na przeciążanie operatora, więc w pewnym sensie operatory są nadal funkcjami (jest to bardzo prawdziwe w D, gdzie operator jest przekazywany jako ciąg znaków w parametrze szablonu).
Wydaje się, że tam, gdzie dozwolone jest przeciążanie operatora, dodanie dodatkowych, niestandardowych operatorów jest często banalne. Znalazłem ten post na blogu , który dowodzi, że operatorzy niestandardowi nie działają dobrze z notacją infix ze względu na reguły pierwszeństwa, ale autor podaje kilka rozwiązań tego problemu.
Rozejrzałem się i nie mogłem znaleźć języków proceduralnych, które mogłyby obsługiwać niestandardowe operatory w tym języku. Są hacki (takie jak makra w C ++), ale to prawie nie to samo, co obsługa języka.
Ponieważ ta funkcja jest dość łatwa do wdrożenia, dlaczego nie jest bardziej powszechna?
Rozumiem, że może to prowadzić do brzydkiego kodu, ale w przeszłości nie powstrzymywało to projektantów języków przed dodawaniem przydatnych funkcji, które można łatwo nadużywać (makra, operator trójskładnikowy, niebezpieczne wskaźniki).
Rzeczywiste przypadki użycia:
- Zaimplementuj brakujące operatory (np. Lua nie ma bitowych operatorów)
- Mimik D
~
(konkatenacja macierzy) - DSL
- Użyj
|
jako uniksowego cukru składniowego w stylu rurkowym (przy użyciu coroutines / generatorów)
Interesują mnie również języki, które pozwalają operatorom niestandardowym, ale bardziej interesuje mnie, dlaczego zostało to wykluczone. Pomyślałem o stworzeniu języka skryptowego w celu dodania operatorów zdefiniowanych przez użytkownika, ale przestałem się, gdy zdałem sobie sprawę, że nigdzie go nie widziałem, więc prawdopodobnie jest dobry powód, dla którego projektanci języków mądrzejsi ode mnie nie pozwolili.