Infix, prefix, postfix. Is it Matter?

Natserract

Natserract

Apr 03, 2021

Infix, prefix, postfix. Is it Matter?

Ketika belajar bahasa pemrogaman, pastinya ada beberapa hal wajib yang tidak boleh dilewatkan, seperti memahami syntax, tipe data, operator, dll. Nah ditulisan kali ini saya akan menyinggung tentang operator.

Operator ini sebenarnya hanyalah sebuah simbol yang digunakan untuk melakukan operasi matematika atau logika tertentu. Jenis-jenis operator banyak, contohnya seperti: (+), (*), (++). Faktanya bahwa kita tidak akan bisa lepas dari matematika di kehidupan, khususnya di bahasa pemrogaman yang matematis yaitu functional programming. Seperti yang dikatakan seorang blogger matematikawan:

"After my involving myself in the subject, one thing that stands out is the relatively low distance between thought expressed in my ordinary day-to-day mathematical discourse, and thought expressed in Haskell code."

Sebagian besar saat kita menulis ekspresi matematika adalah seperti ini:

λ> 2 + 3

Ini adalah cara umum yang digunakan baik di bahasa pemrogaman maupun di sekolah. Jika dilihat pada kode diatas posisi operator (+) berada ditengah operand, ini sesuai dengan prinsip utama dari fp bahwa nilai suatu ekspresi hanya tergantung kepada nilai sub-ekspresinya.

Infix

Infix pada dasarnya adalah hanya sebuah cara yang digunakan untuk menampilkan sebuah operasi, dimana posisi operator ditempatkan diantara operand, contohnya seperti ini:

λ> 3 + 5 * 2

Jika diuraikan, operasi tersebut sebenarnya diartikan seperti "Pertama kalikan 5 * 2, lalu tambahkan hasilnya dengan 3, maka hasilnya adalah 13". Disini mulai muncul beberapa pertanyaan, _mengapa operasi yang pertama kali di evaluasi adalah (_)dulu, bukan(+)? Bukannya harusnya hasilnya adalah 3+5=8*2=16??*

Baik, jawabannya adalah karena semua operator tersebut memiliki prioritas-nya masing-masing, di table ini 9 adalah yang tertinggi. Ini saya ketahui ketika membaca fixity declarations pada haskell.

+--------+----------------------+-----------------------+-------------------+
| Prec- | Left associative | Non-associative | Right associative |
| edence | operators | operators | operators |
+--------+----------------------+-----------------------+-------------------+
| 9 | !! | | . |
| 8 | | | ^, ^^, ** |
| 7 | *, /, `div`, | | |
| | `mod`, `rem`, `quot` | | |
| 6 | +, - | | |
| 5 | | | :, ++ |
| 4 | | ==, /=, <, <=, >, >=, | |
| | | `elem`, `notElem` | |
| 3 | | | && |
| 2 | | | || |
| 1 | >>, >>= | | |
| 0 | | | $, $!, `seq` |
+--------+----------------------+-----------------------+-------------------+

Table diatas berkaitan pada urutan operasi mana yang akan di evaluasi duluan.

Setelah melihat bagaimana prioritas/preseden/precedence pada masing-masing operator diatas, kali ini casenya sedikit berbeda, yaitu dengan penambahan tanda kurung ( )

λ> (3 + 5) * 2

Jika operasi diatas diuraikan hasilnya seperti "Pertama tambahkan 3 dan 5, lalu dikalikan 2, maka hasilnya adalah 16. Pertanyaan muncul lagi, _bukannya (_)mempunyai prioritas 7 > 6(+)??*

Baik, ini karena notasi infix mempunyai aturan dimana jika terdapat tanda kurung ( ) maka prioritas yang paling tinggi adalah ( ) yang bernilai 13. Maka dari itu hasilnya 16.

Prefix (aka Polish)

Prefix atau dikenal sebagai "notasi polandia", dimana posisi operatornya ditulis sebelum operand nya. Ekspresinya seperti ini / * A + B C D. Coba lihat kode dibawah ini:

λ> (+) 3 5 * 2

Pada operasi prefix evaluasi dilakukan dari kiri ke kanan, berdasarkan dua nilai terdekat dari sebelah kanan. Jika merujuk pada kode diatas, mempunyai arti "Pertama tambahkan 3 dan 5, lalu kalikan 2, maka hasilnya adalah 16". Evaluasi pertama terjadi pada (3 + 5) karena dua angka ini saling berdekatan, baru dikalikan 2."

Saya berikan case lain, contoh ekspresinya seperti ini + * 2 10 / 14 2 . Evaluasi yang terjadi "Pertama kalikan 2 dan 10, bagi 14 dengan 2, terakhir 20 + 7 = 27".

Btw notasi prefix tidak mendukung tanda kurung ( ), jadi tidak akan berpengaruh.

Haskell has no prefix operators, with the exception of minus (-), which is both infix and prefix.]

Postfix (aka !Polish)

Postfix disebut "notasi polandia terbalik", dimana posisi operator berada di akhir operand. Notasi ini digunakan beberapa bahasa pemrogaman lama seperti Forth dan Postscript. Coba lihat kode dibawah ini:

λ> (!) :: Bool -> Bool
λ> (!) = not
λ> (True !)

Di haskell sendiri untuk mensupport postfix operators, kamu harus menggunakan syntax extensions pada GHC, Supaya ga kena omel sama compilernya 😀.

Iya, itulah 3 macam notasi yang digunakan dalam penulisan ekspresi. Meskipun prefer ke infix syntax karena lebih mudah dibaca, masing-masing punya maksud dan tujuan tersendiri. Tulisan ini penting bagi kamu terutama yang lagi belajar functional programming, dimana matematis terjadi dimana-mana.