Seberapa berguna operator infiks dalam bahasa pemrograman?

13

Seberapa berguna operator infiks dalam bahasa pemrograman? Apakah mereka sebanding dengan kompleksitas ekstra yang mereka berikan? Bisakah Anda memberikan contoh di mana operator infiks lebih cocok untuk masalah yang tidak dapat ditangani dengan hanya membebani operator normal?

Casebash
sumber
5
Anda harus menjadi seorang Lisper. Apakah saya benar?
missingfaktor
@missingfaktor: Hampir tidak menggunakannya
Casebash
1
Bagaimana hubungan operator infiks dengan overloading operator?
Rein Henrichs
3
Perlu dicatat bahwa mayoritas bahasa OO (ish) populer menggunakan infiks untuk nama metode. Memang beberapa bahasa berusaha keras untuk memungkinkan metode "statis" ditulis sebagai, katakanlah, arg1.method(arg2)daripada method(arg1, arg2).
Tom Hawtin - tackline

Jawaban:

16

Saya pikir operator infiks berasal dari matematika.

Ini:

2 + 3 * 4

lebih mudah dibaca oleh kebanyakan orang

(+ 2 (* 3 4))

karena kebanyakan orang akrab dengan matematika.

Cukup menarik di Haskell Anda dapat melompat antara infiks dan awalan. Ini menggunakan fungsi yang sama "(+)":

(+) 1 2
1 + 2

dan ini menggunakan fungsi "elem" yang sama:

elem 42 [1,2,42]
42 `elem` [1,2,42]
Program Lenny
sumber
Overloading operator normal menangani sebagian besar kasus ini
Casebash
1
@Casebash: operator "normal" itu terkadang juga infix.
liori
2
Saya pasti aneh, karena saya merasa (+ 1 2) jauh lebih mudah dibaca daripada 1 + 2. Paling tidak (+ 1 2 3 4 5)lebih baik daripada 1 + 2 + 3 + 4 + 5.
Joe D
Ada juga RPN: dorong elemen, lalu operator.
PhiLho
@PhiLho Disebut juga operator postfix! Seperti ini: 1 2 +atau 1 2 3 4 5 +atau lebih biasanya untuk kasus terakhir 1 2 + 3 + 4 + 5 +. Sebenarnya ada keuntungan bagus bagi mereka yang memodelkan sistem berbasis tumpukan dengan sempurna, dan jarang (jika pernah?) Membutuhkan tanda kurung untuk menyesuaikan prioritas operator.
CodexArcanum
6

Bahasa komputer dirancang untuk manusia, bukan mesin. Dan manusia lebih terbiasa menginfiksasi operator daripada pre atau postfixes.

Gulshan
sumber
6

Satu-satunya alasan nyata bagi operator infiks adalah bahwa manusia pada umumnya menemukan mereka lebih mudah dibaca. Ini sebagian besar disebabkan oleh dua fakta:

  • Kami mempelajari operator infiks dalam bentuk matematika sejak usia dini dan karenanya akrab dengan mereka: 2 * 2 = 4dll.
  • Operator infiks memiliki keuntungan "secara visual" memisahkan dua argumen. misalnya(some complex expression) + (some other complex expression)

Dari perspektif logis / mesin, operator infiks tidak benar-benar menambah nilai dan dalam beberapa kasus merupakan gangguan:

  • Anda selalu dapat mengonversi dari infix ke panggilan fungsi yang setara dengan dua argumen - jadi operator infiks tidak pernah lebih dari "gula sintaksis"
  • Infix dapat merepotkan saat Anda ingin menggunakan lebih dari dua parameter. (* 1 2 3 4 5)di Lisp misalnya bisa dibilang sintaks yang jauh lebih bersih untuk mengalikan satu set angka.
  • Dari perspektif penguraian, sering berguna untuk membaca operator terlebih dahulu sehingga Anda tahu bagaimana menafsirkan sisa ekspresi. Dengan operator infiks ini bisa menjadi jauh lebih kompleks (misalnya Anda harus memelihara tumpukan atau sesuatu yang mirip untuk mengetahui operator mana yang berlaku untuk argumen mana)
  • Dalam bahasa berbasis stack / concatenative seperti Forth, Anda ingin agar operator didorong pada stack yang terakhir, sehingga sudah memiliki argumen di posisi yang tepat. Sekali lagi, mengubur operator di tengah urutan token hanya mempersulit masalah.
  • Operator infix memang bisa menjadi sangat membingungkan ketika mereka kelebihan beban - apa artinya "+" ketika diterapkan pada dua HashMaps misalnya? Di sini, pemahaman manusia intuitif dari operator infiks bekerja melawan Anda karena mudah untuk menganggap makna yang sebenarnya tidak dimaksudkan .....
mikera
sumber
Saya pikir argumen terakhir adalah palsu. Terserah programmer untuk menggunakan nama yang masuk akal untuk fungsi, apakah menggunakan simbol atau huruf.
Tom Hawtin - tackline
@ Tom - tentu saja, programmer harus memilih nama yang masuk akal. Tetapi salah satu kriteria kunci untuk "masuk akal" adalah "dapatkah orang lain memahaminya secara intuitif?" - Saya telah melihat banyak case dengan operator overloading di mana ini jauh dari case. Saya tidak ingin harus membalikkan definisi konyol tentang apa artinya >> >> = seseorang ketika diterapkan pada beberapa tipe data sewenang-wenang. Tolong, nama fungsi yang tepat!
mikera