Наскільки корисні оператори infix мовою програмування?


13

Наскільки корисні оператори infix мовою програмування? Чи варті вони додаткової складності, яку вони надають? Чи можете ви навести будь-які приклади, коли оператори інфікування краще підходять до проблеми, з якою не вдається впоратися, просто перевантаживши звичайні оператори?


5
Ти повинен бути Лиспер. Я правий?
зниклий фактор

@missingfaktor: Ледве використовував це
Casebash

1
Як оператори інфікування пов'язані з перевантаженням оператора?
Рейн Генріхс

3
Варто зазначити, що більшість популярних мов OO (ish) використовують infix для імен методів. Дійсно, деякі мови переходять на деяку довжину, щоб дозволяти писати «статичні» методи як, скажімо, arg1.method(arg2)а не method(arg1, arg2).
Том Хотін - тайклін

Відповіді:


16

Я думаю, що оператори інфікування випливають з математики.

Це:

2 + 3 * 4

є більш читабельною для більшості людей, ніж

(+ 2 (* 3 4))

адже більшість людей знайомі з математикою.

Досить цікаво в Haskell, ви можете переходити між інфіксом і префіксом. Для цього використовується одна і та ж функція "(+)":

(+) 1 2
1 + 2

і це використовує ту ж функцію "elem":

elem 42 [1,2,42]
42 `elem` [1,2,42]

Перевантаження нормальних операторів обробляє більшість випадків цього
Casebash

1
@Casebash: ті "звичайні" оператори іноді теж інфіксуються.
liori

2
Я, мабуть, просто дивніший, бо мені здається, що (+ 1 2) це читає набагато більше1 + 2 . Принаймні (+ 1 2 3 4 5), краще, ніж 1 + 2 + 3 + 4 + 5.
Джо D

Є також RPN: натисніть елементи, потім оператор.
PhiLho

@PhiLho Також називають операторами Postfix! Ось так: 1 2 +або 1 2 3 4 5 +або більше, як правило, для останнього випадку 1 2 + 3 + 4 + 5 +. Насправді видатна перевага в порівнянні з тим, що вона ідеально моделює систему, засновану на стеках, і рідко (якщо взагалі?) Потрібні дужки для регулювання пріоритету оператора.
CodexArcanum

6

Комп'ютерні мови розроблені для людей, а не для машин. А люди більше використовуються для інфікування операторів, ніж до або постфікси.


6

Єдина реальна причина операторів інфікування - це те, що люди, як правило, їх легше читати. Багато в чому це пов'язано з двома фактами:

  • Ми вивчаємо оператори інфікування у формі математики з самого раннього віку, а значить, з ними знайомі: 2 * 2 = 4тощо.
  • Оператор інфіксації має перевагу "візуально" розділення двох аргументів. напр(some complex expression) + (some other complex expression)

З логічної / машинної точки зору, оператори інфікування насправді не додають ніякого значення, а в деяких випадках викликають неприємності:

  • Ви завжди можете перетворити з інфіксації в еквівалентний виклик функції з двома аргументами - тож оператори інфікування ніколи не перевищують "синтаксичний цукор"
  • Infix може бути незручним, коли ви хочете використовувати більше двох параметрів. (* 1 2 3 4 5)Наприклад, у Ліспі, мабуть, набагато чистіший синтаксис для множення набору чисел.
  • З точки зору розбору, часто корисно спочатку прочитати оператора, щоб ви могли інтерпретувати залишок виразу. З операторами infix це може бути набагато складніше (наприклад, ви повинні підтримувати стек або щось подібне, щоб з'ясувати, який оператор застосовує до яких аргументів)
  • У мовах, заснованих на стеках / конкатенати, таких як Forth, ви хочете, щоб оператор був висунутий на стек останнім, так що він вже має свої аргументи в потрібному положенні. Знову ж таки, поховання оператора посеред послідовності лексем лише ускладнює питання.
  • Оператори Infix можуть дійсно дуже заплутатися, коли вони перевантажені - що означає "+", наприклад, застосований до двох HashMaps? Тут інтуїтивне людське розуміння оператора infix працює проти вас, оскільки легко припустити значення, яке насправді не було призначено .....

Я думаю, що останній аргумент - хибний. Програміст повинен використовувати розумні імена для функцій, будь то символи чи букви.
Том Хотін - тайклін

@ Упевнений, програмісти повинні вибирати розумні імена. Але одним з ключових критеріїв "розумного" є "чи можуть інші люди інтуїтивно це зрозуміти?" - Я бачив безліч випадків перевантаження оператора там, де це далеко не так. Мені не хочеться змінювати інженерне химерне визначення того, що означає ">> =" при застосуванні до якогось довільного типу даних. Правильні назви функцій, будь ласка!
мікера
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.