Jak przydatne są operatory infix w języku programowania?


13

Jak przydatne są operatory infix w języku programowania? Czy są warte dodatkowej złożoności, którą zapewniają? Czy możesz podać jakieś przykłady, w których operatory infix lepiej pasują do problemu, którego nie można rozwiązać przez przeciążenie zwykłych operatorów?


5
Musisz być Lisperem. Czy mam rację?
missingfaktor

@missingfaktor: Ledwo go
użyłem

1
W jaki sposób operatorzy infix są związani z przeciążeniem operatora?
Rein Henrichs

3
Warto zauważyć, że większość popularnych języków OO (ish) używa nazw w nazwach metod. Rzeczywiście, niektóre języki starają się pisać metody „statyczne” tak, jak powiedzmy, arg1.method(arg2)zamiast method(arg1, arg2).
Tom Hawtin - tackline

Odpowiedzi:


16

Myślę, że operatory infix wywodzą się z matematyki.

To:

2 + 3 * 4

jest bardziej czytelny dla większości ludzi niż

(+ 2 (* 3 4))

ponieważ większość ludzi zna matematykę.

Interesująco w Haskell możesz przeskakiwać między infix a prefiksem. Używa tej samej funkcji „(+)”:

(+) 1 2
1 + 2

i używa tej samej funkcji „elem”:

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

Przeciążenie normalnych operatorów obsługuje większość takich przypadków
Casebash

1
@Casebash: te „normalne” operatory czasami też są niepoprawne.
liori

2
Muszę być po prostu dziwny niż, ponieważ uważam, że (+ 1 2) jest bardziej czytelny niż 1 + 2. Przynajmniej (+ 1 2 3 4 5)jest lepszy niż 1 + 2 + 3 + 4 + 5.
Joe D

Istnieje również RPN: pchnij elementy, a następnie operatora.
PhiLho,

@PhiLho Zwane także operatorami Postfiksów! W ten sposób: 1 2 +lub 1 2 3 4 5 +częściej w ostatnim przypadku 1 2 + 3 + 4 + 5 +. Istnieje naprawdę spora zaleta dla tych, ponieważ doskonale modeluje system oparty na stosie i rzadko (jeśli w ogóle?) Potrzebuje nawiasów, aby dostosować pierwszeństwo operatora.
CodexArcanum

6

Języki komputerowe są przeznaczone dla ludzi, a nie maszyn. A ludzie są bardziej przyzwyczajeni do infiksowania operatorów niż przedrostków lub postfiksów.


6

Jedynym prawdziwym powodem dla operatorów infix jest to, że ludzie zazwyczaj uważają je za łatwiejsze do odczytania. Wynika to głównie z dwóch faktów:

  • Uczymy się operatorów infix w postaci matematyki od najmłodszych lat i dlatego znamy je: 2 * 2 = 4itp.
  • Operator infix ma tę zaletę, że „wizualnie” oddziela dwa argumenty. na przykład(some complex expression) + (some other complex expression)

Z punktu widzenia logiki / maszyny operatorzy infix tak naprawdę nie dodają żadnej wartości, aw niektórych przypadkach są uciążliwe:

  • Zawsze możesz przekonwertować z infix na równoważne wywołanie funkcji za pomocą dwóch argumentów - więc operatory infix nigdy nie są niczym więcej niż „cukrem syntaktycznym”
  • Infix może być niewygodny, jeśli chcesz użyć więcej niż dwóch parametrów. (* 1 2 3 4 5)na przykład w Lisp jest zapewne o wiele czystszą składnią do mnożenia zestawu liczb.
  • Z perspektywy analizy często warto najpierw przeczytać operator, aby wiedzieć, jak interpretować pozostałą część wyrażenia. W przypadku operatorów infix może to być znacznie bardziej skomplikowane (np. Musisz zachować stos lub coś podobnego, aby dowiedzieć się, który operator ma zastosowanie do których argumentów)
  • W językach opartych na stosie / konkatenatywnych, takich jak Forth, operator musi być odkładany na stos na końcu, aby już miał argumenty we właściwej pozycji. Ponownie zakopanie operatora w środku sekwencji żetonów tylko komplikuje sprawy.
  • Operatorzy Infix mogą się naprawdę dezorientować, kiedy są przeciążeni - co oznacza „+”, na przykład w przypadku zastosowania dwóch HashMap? Tutaj intuicyjne ludzkie zrozumienie operatora infix działa przeciwko tobie, ponieważ łatwo jest przyjąć znaczenie, które w rzeczywistości nie było zamierzone .....

Myślę, że ostatni argument jest fałszywy. Do programisty należy użycie rozsądnych nazw funkcji, czy to za pomocą symboli, czy liter.
Tom Hawtin - hals

@Tom - na pewno programiści powinni wybierać rozsądne nazwy. Ale jednym z kluczowych kryteriów „rozsądnego” jest „czy inni ludzie mogą to intuicyjnie zrozumieć?” - Widziałem wiele przypadków przeciążenia operatora, gdy jest to dalekie od przypadku. Nie chcę zmuszać do inżynierii wstecznej czyjegoś dziwacznego pojęcia, co oznacza „>> =” w przypadku zastosowania do dowolnego dowolnego typu danych. Proszę podać prawidłowe nazwy funkcji!
mikera
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.