Ada dua kasus berbeda yang perlu dipertimbangkan, tergantung pada sintaksis bahasa Anda. Jika bahasa Anda menggunakan tanda kurung untuk menunjukkan aplikasi fungsi (misalnya f(2+1)
) maka prioritas tidak relevan. Fungsi harus didorong ke tumpukan dan muncul setelah (untuk contoh di atas, hasilnya adalah 2 1 + f
). Sebagai alternatif, Anda dapat memperlakukan fungsi sebagai nilai dan mengeluarkannya segera, dan mengeluarkan operasi pemanggilan fungsi setelah tanda kurung tutup (yang seharusnya diperlakukan sama dengan tanda kurung lainnya), misalnya f 2 1 + $
, di mana $
operasi pemanggilan fungsi.
Jika bahasa Anda, bagaimanapun, tidak menggunakan tanda kurung untuk menunjukkan pemanggilan fungsi, tetapi sebaliknya menempatkan argumen langsung setelah fungsi tanpa tanda baca khusus (misalnya f 2 + 1
), seperti yang terjadi pada contoh Wikipedia, maka hal-hal sedikit lebih rumit. Perhatikan bahwa ungkapan yang baru saja saya berikan adalah contoh yang ambigu: apakah f diterapkan pada 2 dan 1 ditambahkan ke hasilnya, atau apakah kita menambahkan 2 dan 1 bersamaan dan kemudian memanggil f dengan hasilnya?
Sekali lagi, ada dua pendekatan. Anda cukup mendorong fungsi ke tumpukan operator ketika Anda menjumpainya dan menetapkannya prioritas apa pun yang Anda inginkan. Ini adalah pendekatan yang paling sederhana, dan tampaknya apa yang telah dilakukan oleh contoh yang dikutip. Namun, ada masalah praktis. Pertama, bagaimana Anda mengidentifikasi suatu fungsi? Jika Anda memiliki set yang terbatas itu mudah, tetapi jika Anda memiliki fungsi yang ditentukan pengguna, ini berarti parser Anda perlu memberi umpan balik ke lingkungan Anda, yang dapat menjadi berantakan dengan cepat. Dan bagaimana Anda menangani fungsi dengan banyak argumen?
Perasaan saya adalah bahwa untuk gaya sintaksis ini, menggunakan fungsi sebagai nilai yang lebih handier oleh operator aplikasi fungsi jauh lebih masuk akal. Kemudian, Anda bisa menyuntikkan operator aplikasi setiap kali Anda membaca nilai dan hal terakhir yang Anda baca juga merupakan nilai, sehingga Anda tidak perlu cara khusus untuk mengetahui pengidentifikasi mana yang berfungsi. Anda juga dapat bekerja dengan ekspresi yang mengembalikan fungsi (yang sulit atau tidak mungkin dengan gaya fungsi-sebagai-operasi). Dan ini berarti Anda dapat menggunakan currying untuk menangani beberapa fungsi argumen, yang merupakan penyederhanaan besar untuk mencoba menanganinya secara langsung.
Satu-satunya hal yang perlu Anda putuskan adalah apa yang menjadi prioritas aplikasi fungsi. Pilihannya terserah Anda, tetapi dalam setiap bahasa yang saya gunakan yang berfungsi seperti ini, ia telah menjadi operator yang paling kuat dalam bahasa tersebut, dan telah diasosiasikan dengan benar. (Satu-satunya variasi yang menarik adalah Haskell, yang selain memiliki versi pengikatan yang sangat jelas, juga memiliki sinonim dengan simbol $
yang merupakan operator pengikat yang paling lemah dalam bahasa tersebut, yang memungkinkan ekspresi seperti f 2 + 1
menerapkan f ke 2 dan f $ 2 + 1
untuk menerapkan ke seluruh sisa ekspresi)
sin( max( 2 3) / 3 * 3.1415)