Topik ini merinci alur kerja harian di shell erl: mengevaluasi ekspresi, mengelola state pengikatan variabel, mengompilasi modul langsung dari shell, mengulang ekspresi dari riwayat, dan keluar dengan rapi. Seluruh transkrip di bawah ini berasal dari satu sesi erl yang sama pada OTP 29, sehingga nomor urut perintahnya berlanjut dari satu blok ke blok berikutnya.
Evaluasi ekspresi dan pengikatan#
Shell erl membaca satu ekspresi, mengevaluasinya, lalu mencetak hasilnya. Setiap ekspresi diakhiri titik. Bila titik belum diberikan, Enter hanya membuka baris lanjutan dan ekspresi belum dieksekusi. Pada sesi berikut, ekspresi pertama dihitung langsung, ekspresi kedua mengikat variabel X, dan ekspresi ketiga membaca nilainya:
Erlang/OTP 29 [erts-17.1.1] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:1] [jit:ns]
Eshell V17.1.1 (press Ctrl+G to abort, type help(). for help)
1> 1 + 2.
3
2> X = 40 + 2.
42
3> X.
42Angka di depan tanda > adalah nomor urut ekspresi dalam sesi. Perhatikan bahwa pengikatan X = 40 + 2. mencetak nilai hasilnya, yaitu 42, sekaligus menandai keberhasilan pencocokan. Variabel di Erlang diikat sekali saja, dan aturan lengkapnya dibahas pada modul Bahasa. Di sini yang penting adalah shell menyimpan pengikatan itu sebagai bagian dari state sesi. Semua yang diketik di shell diperlakukan sebagai ekspresi yang menghasilkan nilai, termasuk pemanggilan fungsi-fungsi shell sendiri, yang biasanya mengembalikan atom ok setelah pekerjaannya selesai.
Mengelola state shell#
Shell menyediakan fungsi bawaan untuk memeriksa dan mengosongkan state. Fungsi b() mencetak semua pengikatan yang aktif, sedangkan f() mengosongkan seluruhnya. Sambungan sesi berikut memperlihatkan keduanya beserta akibatnya:
4> b().
X = 42
ok
5> f().
ok
6> X.
* 1:1: variable 'X' is unboundFungsi b() mencetak daftar pengikatan lalu mengembalikan ok. Setelah f() mengosongkan seluruh pengikatan, ekspresi X. tidak lagi menghasilkan nilai melainkan pesan error variable ‘X’ is unbound, karena variabel itu memang sudah tidak terikat. f() adalah fasilitas shell, bukan bagian dari bahasa: di dalam berkas .erl tidak ada pembebasan variabel, dan aturan single assignment tetap berlaku. Keduanya juga punya bentuk untuk satu nama tertentu: b(X) menampilkan satu pengikatan saja, sedangkan f(X) melepas satu variabel tanpa mengganggu pengikatan lainnya.
Kompilasi modul dari shell#
Modul dapat dikompilasi langsung dari shell dengan fungsi c/1, tanpa menutup sesi. Siapkan berkas kalkulator.erl berikut di folder kerja, misalnya dengan menyalinnya dari unduhan topik ini:
-module(kalkulator).
-export([tambah/2]).
tambah(A, B) -> A + B.Lalu kompilasi dan panggil dari shell yang sama:
7> c(kalkulator).
{ok,kalkulator}
8> kalkulator:tambah(2, 3).
5Fungsi c(kalkulator). mengompilasi kalkulator.erl, menghasilkan berkas kalkulator.beam di folder kerja, dan memuat modulnya ke VM. Nilai kembalinya berupa tuple {ok,kalkulator}. Pemanggilan kalkulator:tambah(2, 3). menunjukkan format panggilan fungsi lintas modul, yaitu NamaModul:NamaFungsi(Argumen).. Apabila c/1 mengembalikan {error, ...}, bacalah pesannya: penyebab yang paling sering adalah berkas .erl tidak ada di folder kerja atau nama modul tidak cocok dengan nama berkasnya.
Menjalankan c(kalkulator). sekali lagi di sesi yang sama juga sah dan lazim: modul yang sudah ada dimuat ulang dengan versi baru, sehingga pemanggilan berikutnya memakai definisi terkini. Pada keadaan normal, VM menyimpan dua versi modul, yaitu versi lama untuk proses yang masih mengeksekusinya dan versi baru untuk pemanggilan berikutnya. Mekanisme pemuatan kode ini menjadi fondasi pembaruan kode tanpa menghentikan sistem yang dibahas pada modul OTP behaviour.
Riwayat ekspresi#
Shell merekam setiap ekspresi yang pernah diketik. Fungsi e(N) mengeksekusi ulang ekspresi nomor N, sedangkan v(N) mengambil nilai hasilnya tanpa mengeksekusi ulang. Sambungan sesi berikut mengulang ekspresi nomor 1, yang merupakan 1 + 2.:
9> e(1).
3
10> kalkulator:tambah(10, 32).
42e(1). menghasilkan 3 kembali karena ekspresi nomor 1 dieksekusi ulang sepenuhnya. Perbedaan e(N) dan v(N) penting dipahami: e(N) menjalankan kembali perintahnya sehingga efek sampingnya terulang, sedangkan v(N) hanya membaca kembali nilai yang tersimpan tanpa mengeksekusi apa pun. Untuk menelusuri riwayat perintah pada prompt, gunakan tombol panah atas dan bawah seperti pada terminal umumnya, dan fungsi h() mencetak daftar lengkap fungsi-fungsi shell.
Keluar dari shell#
Fungsi q() menghentikan VM dengan bersih dan menutup sesi:
11> q().
okPanggilan q() setara dengan init:stop(), yaitu menghentikan VM secara tertib. Baris kedua banner sesi di atas sudah menyebutkan dua fasilitas darurat lain: Ctrl+G membuka menu untuk memutus sesi ketika shell terasa macet, dan help(). mencetak bantuan fungsi shell. Menu Ctrl+G juga menjadi jalan untuk membuat sesi shell jarak jauh atau menghentikan VM yang tidak merespons, dan pilihan q di menu tersebut sama fungsinya dengan q().
Kesalahan umum#
- Lupa titik di akhir ekspresi. Shell menampilkan prompt lanjutan dan seolah tidak merespons, karena ekspresi baru dianggap selesai hanya setelah titik diberikan. Perbaikannya sederhana, yaitu mengetikkan titik lalu Enter.
- Menganggap
f()sebagai fitur bahasa. Di berkas.erl, mencoba mengikat ulang variabel terikat memicu error pencocokan.f()hanya berlaku di sesi shell. - Menjalankan
c(nama_modul)dari folder yang salah. Fungsic/1mencari berkas.erldi folder kerja shell, sehingga berkas tidak ditemukan bila shell dijalankan dari lokasi lain. Pindahkan folder kerja ke lokasi berkas tersebut sebelum kompilasi.
Ringkasan#
- Shell erl mengevaluasi satu ekspresi per baris yang diakhiri titik, dan nomor di depan prompt adalah nomor urut ekspresi dalam sesi.
b()danf()mengelola state pengikatan shell, dan keduanya bukan bagian dari bahasa.c/1mengompilasi dan memuat modul dari shell, menghasilkan berkas .beam, dan mengembalikan tuple {ok,NamaModul} saat berhasil.e(N)mengeksekusi ulang ekspresi dari riwayat danv(N)mengambil nilainya, sedangkanq()menutup VM dengan bersih.
Referensi#
- shell — Ericsson — Dokumentasi resmi shell Erlang beserta fungsi-fungsi seperti b(), f(), e(), dan h().
- c — Ericsson — Dokumentasi resmi modul c untuk kompilasi dan pemuatan kode dari shell.
- Learn You Some Erlang for Great Good! — Fred Hebert — Pengenalan shell dan alur kerja pertama dengan erl.