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.
fn ganda(a: Int) -> Int:
return a * 2
def main():
print(ganda(21))Jalankan berkas tersebut untuk melihat penolakan compiler.
# berkas yang masih memakai kata kunci fn
mojo run fn.mojo/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 modulePesan '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.
def ganda(a: Int) -> Int:
return a * 2
def main():
print(ganda(21))# versi yang sudah dimigrasikan ke def
mojo run ganda.mojo42Program 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#
fnadalah 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
fndan menyatukan semua fungsi ke dalamdef. - Compiler 1.2.0 menolak setiap
fndengan pesan'fn' has been removed; use 'def' instead, sehingga migrasinya berupa penggantian kata kunci. - Disiplin ketat
fnberpindah kedefbertipe, yaitu tipe argumen yang wajib, tipe kembalian yang wajib untuk nilai kembalian, danraisesyang eksplisit.
Referensi#
- Mojo releases — Modular — Lini masa rilis resmi Mojo yang mencatat rilis 1.0.0 pada Agustus 2026.
- Functions — Mojo Manual — Deklarasi fungsi terkini yang hanya mengenal kata kunci def.
- Mojo Manual — Modular — Dokumentasi resmi bahasa Mojo versi 1.2.0 sebagai rujukan aturan yang berlaku.