Fungsi fn

Menelusuri fungsi fn, keputusan penghapusannya di 1.0, dan disiplin ketat yang dipindahkan ke def bertipe.

Daftar isi

Selain def, Mojo era pra-1.0 mengenal kata kunci fungsi kedua bernama fn yang menuntut disiplin pengetikan lebih ketat. Kata kunci tersebut telah dihapus sejak rilis 1.0 pada Agustus 2026, sehingga compiler terkini menolak setiap deklarasi fn dan menyarankan def sebagai penggantinya. Topik ini menelusuri kedudukan fn sebelum penghapusannya, memperagakan pesan error yang muncul pada compiler 1.2.0, dan menunjukkan ke mana disiplin ketatnya berpindah. Pemahaman ini diperlukan karena banyak tutorial lama masih menggunakan fn di dalam contohnya.

Kedudukan fn sebelum 1.0#

Sebelum versi 1.0, Mojo membedakan dua jenis fungsi dengan dua kata kunci. Fungsi def mengikuti gaya Python dengan aturan pengetikan yang longgar, sedangkan fungsi fn menandai fungsi yang dikompilasi dengan disiplin ketat. Pada fungsi fn, tipe setiap argumen dan tipe kembalian wajib dideklarasikan, error tidak dapat disebarkan tanpa dinyatakan secara eksplisit, dan compiler menolak konversi tipe yang tidak dinyatakan secara eksplisit. Pendekatan dua kata kunci ini memudahkan pemula membawa kode bergaya Python, tetapi menambah beban pembelajaran karena dua tata bahasa fungsi yang berbeda harus dikuasai sekaligus.

Rilis 1.0 mengambil keputusan desain yang berbeda, yaitu menyatukan kedua jenis fungsi menjadi satu. Semua fungsi kini ditulis dengan def, sedangkan disiplin ketat yang dulu menjadi ciri fn dipindahkan ke aturan pengetikan def itu sendiri. Keputusan ini menyederhanakan bahasa menjadi satu tata bahasa fungsi, dan sejarahnya terekam pada lini masa rilis resmi Mojo.

Pesan error penghapusan fn#

Compiler 1.2.0 menolak fn sejak tahap penguraian awal dan menampilkan pesan yang langsung menunjukkan penggantinya. Berkas fn.mojo berisi program kecil yang masih ditulis dengan gaya pra-1.0, yaitu fungsi ganda yang dideklarasikan dengan fn.

mojo fn.mojo
fn ganda(a: Int) -> Int:
    return a * 2


def main():
    print(ganda(21))

Jalankan berkas tersebut untuk melihat penolakan compiler.

bash
# berkas yang masih memakai kata kunci fn
mojo run fn.mojo
text Keluaran
/home/kal/my-project/content/mojo/dua-jenis-fungsi/fungsi-fn/fn.mojo:1:1: error: 'fn' has been removed; use 'def' instead
fn ganda(a: Int) -> Int:
^~
def
/home/kal/.pixi/envs/mojo/bin/mojo: error: failed to parse the provided Mojo source module

Pesan 'fn' has been removed; use 'def' instead menyatakan dua hal sekaligus, yaitu kata kunci tersebut sudah tidak ada dan penggantinya adalah def. Penunjuk posisi 1:1 menunjuk tepat pada kata fn di baris pertama, sehingga lokasi yang harus diperbaiki tidak perlu dicari. Compiler bahkan menampilkan bentuk perbaikannya di bawah baris yang bermasalah.

Migrasi ke def#

Perbaikan untuk program sederhana hanya berupa penggantian kata kunci fn menjadi def, tanpa perubahan pada daftar argumen maupun tipe kembalian. Signature ganda(a: Int) -> Int sudah memuat tipe secara lengkap, sehingga badan dan signature-nya dapat dipertahankan apa adanya. Berkas ganda.mojo memuat versi yang sudah dimigrasikan.

mojo ganda.mojo
def ganda(a: Int) -> Int:
    return a * 2


def main():
    print(ganda(21))
bash
# versi yang sudah dimigrasikan ke def
mojo run ganda.mojo
text Keluaran
42

Program yang sama kini dikompilasi dan mencetak 42. Perbandingan kedua berkas menunjukkan bahwa penghapusan fn tidak mengubah cara menulis signature yang sudah eksplisit. Yang berubah hanyalah kata kuncinya, sedangkan disiplin pengetikannya tetap dipertahankan. Fungsi ganda memang sudah bertipe lengkap sejak ditulis dengan fn, sehingga tidak ada penyesuaian lain yang tersisa. Apabila contoh lama memuat deklarasi tanpa tipe, penyesuaian tipenya menyusul setelah penggantian kata kunci, dan pesan error berikutnya menunjukkan letaknya.

Disiplin fn pada def bertipe#

Disiplin ketat yang dulu menjadi ciri fn kini berlaku pada setiap def yang signature-nya bertipe lengkap. Tipe argumen wajib dideklarasikan pada semua fungsi, tipe kembalian wajib ditulis setiap kali fungsi mengembalikan nilai, dan penyebaran error wajib ditandai dengan raises. Aturan ini menjadikan perilaku fungsi dapat diprediksi pada saat kompilasi, tanpa perbedaan perilaku antara dua kata kunci seperti pada era pra-1.0.

Perbedaan terbesar dengan era pra-1.0 terletak pada hilangnya pilihan gaya longgar di tingkat bahasa. Definisi tanpa tipe tidak lagi sah dalam bentuk apa pun, sehingga kelonggaran yang tersisa hanya menyangkut tipe kembalian yang boleh dihilangkan untuk fungsi tanpa nilai kembalian. Dahulu, pengetikan yang longgar ditangani melalui def, sedangkan kini kelonggaran tersisa pada satu titik saja dan sisanya konsisten ketat.

Kesalahan umum#

Kesalahan yang paling lazim adalah menyalin contoh fn dari tutorial lama tanpa penyesuaian. Compiler menolaknya dengan pesan yang telah diperagakan di atas, dan perbaikannya adalah mengganti kata kunci tersebut dengan def. Setelah penggantian, periksa apakah contohnya memuat penanganan error yang sesuai.

Kesalahan kedua terjadi ketika fn sudah diganti def tetapi penanda raises ikut terhapus. Era pra-1.0 memperlakukan error secara eksplisit pada fn, dan compiler terkini mempertahankan disiplin yang sama pada def. Fungsi yang memanggil fungsi bertanda raises wajib menangkap error dengan try atau meneruskan penanda raises, sebagaimana dijelaskan pada pembahasan fungsi def. Tanpa salah satu dari keduanya, program ditolak compiler sebelum dijalankan.

Ringkasan#

  • fn adalah kata kunci fungsi kedua pada era pra-1.0 yang menuntut tipe eksplisit dan penyebaran error yang dinyatakan secara jelas.
  • Rilis 1.0 pada Agustus 2026 menghapus fn dan menyatukan semua fungsi ke dalam def.
  • Compiler 1.2.0 menolak setiap fn dengan pesan 'fn' has been removed; use 'def' instead, sehingga migrasinya berupa penggantian kata kunci.
  • Disiplin ketat fn berpindah ke def bertipe, yaitu tipe argumen yang wajib, tipe kembalian yang wajib untuk nilai kembalian, dan raises yang eksplisit.

Referensi#