7 days of WordPress plugins, themes & templates - for free!* Unlimited asset downloads! Start 7-Day Free Trial
Advertisement
  1. Code
  2. Elixir

Cara Menggunakan Elixir Comprehensions

Scroll to top
Read Time: 7 mins

Indonesian (Bahasa Indonesia) translation by Husain Ali Yahya (you can also view the original English article)

Elixir adalah sebuah bahasa pemograman yang masih sangat muda (muncul pada tahun 2011), tapi dia sekarang sedang populer. Pada awalnya saya teretarik dengan bahasa ini karena saat menggunakannya kamu bisa menyelesaikan beberapa tugas programmer dari sudut pandang yang berbeda. Contohnya, kamu bisa melakukan iterasi tanpa menggunakan siklus for atau mengorganisasikan kode-mu tanpa classes.

Elixir memiliki beberapa fitur yang sangat bertenaga dan menarik yang bisa jadi sulit dipahami jika kamu berasal dari dunia OOP. Namun, setelah beberapa saat, semuanya mulai terasa logis dan kamu bisa melihat betapa expresif kode-nya. Comprehensions adalah salah satunya dan pada artikel ini saya akan menjelaskan cara menggunakannya.

Comprehensions dan Mapping

Pada dasarnya, sebuah list comprehension adalah konstruksi spesial yang mengizinkanmu untuk buat sebuah daftar baru di atas yang sudah ada, Konsep ini ditemukan pada bahasa-bahasa seperti Haskell dan Clojure. Erlang juga memilikinya, makanya, Elixir memiliki comprehensions juga.

Kamu mungkin bertanya-tanya perbedaan comprehensions dengan fungsi map/2 yang juga mengambil dan memproduksi koleksi yang baru? Itu bisa jadi pertanyaan yang cukup bagus! Baik, pada kasus paling sederhana, comprehension melakukan hal yang sama. Perhatikan contoh berikut:

Di sini saya mengambil sebuah daftar dengan tiga angka dan membuat sebuah daftar baru dengan seluruh angka-nya yang dikalikan oleh 2. panggilan map dapat disederhanakan lebih jauh menjadi Enum.map( &(&1 * 2) ).

Fungsi do_something/1 bisa ditulis kembali menggunakan comprehension:

Inilah penampilan dari comprehension, menurut saya, kode-nya sedikit lebih elegan dari yang di kode pertama. Di sini, sekali lagi, kita mengambil tiap elemen dari daftar dan mengalikannya dengan 2. Bagian el <- list disebut sebagai generator dan dia menjelaskan secara pasti pengambilan nilai dari koleksi sesuai yang kamu inginkan.

Ingat bahwa kita tidak dipaksa untuk melewatkan sebuah daftar ke fungsi do_something/1 - kode-nya akan bekerja dengan apapun yang bisa dienumerasi.

Pada contoh ini, saya melewatkan sebuah rentang sebagai sebuah argumen.

Comprehension bekerja dengan binstring juga. Sintaks-nya sedikit berbeda karena kamu harus melingkupi generatormu dengan << dan >>. Mari demosntrasikan ini dengan membuat sebuah fungsi sederhana untuk "mengambil" sebuah string yang dilindungi dengan Caesar cipher. Ide-nya sederhana: kita mengganti tiap huruf dari kata dengan sebuah huruf dari angka tetap posisi alfabet-nya. Saya akan menggesernya 1 posisi agar sederhana.

Ini terlihat sangat mirip dengan contoh sebelumnya kecuali di bagian << dan >>. Kita mengambil sebuah kode dari tiap karakter dalam string, menguranginya dengan satu dan membuat sebuah string lagi. Sehingga pesan tersandi-nya adalah "elixir"!

Namun tetap, ada lebih banyak lagi selain itu. Salah satu fitur berguna lainnya dari comprehensions adalah kemampuannya untuk menyaring keluar beberapa elemen.

Comprehensions dan Filtering

Mari perluas contoh pertama kita. Saya akan melewatkan serentang integers dari 1 hingga 20, hanya mengambil elemen yang genap dan mengalikannya dengan 2:

Di sini saya harus menyaratkan modul Interger-nya untuk mampu menggunakan macro is_even/1. Dan juga, saya menggunakan Stream untuk mengoptimasi kode-nya sedikit dan mencegah iterasinya dilakukan dua kali.

Sekarang mari tulis contoh ini kembali dengan comprehension:

Jadi, seperti yang kamu lihat, for bisa menerima sebuah filter opsional untuk melewati beberapa elemen dari koleksinya.

Kamu tidak dibatasi hanya dengan satu filter, sehingga kode berikut juga-lah valid:

Dia akan mengambil semua angka genap kurang dari 10. Jangan lupa untuk membatasi filter-filter dengan koma.

Filter-nya akan dievaluasi untuk tiap elemen dari koleksinya dan jika evaluasi-nya mengembalikan true, blok-nya akan dieksekusi. Jika tidak, sebuah elemen baru diambil. Apa yang menarik adalah generator juga bisa digunakan untuk menyaring elemen-elemen menggunakan when:

Ini sangat mirip dengan apa yang kita lakukan ketika menulis guard clauses:

Comprehensions dengan Banyak Koleksi

Sekarang anggap tidak memiliki satu tapi dua koleksi sekaligus, dan kita ingin membuat sebuah koleksi baru. Contohnya,mengambil semua angka genap-nya dari koleksi pertama dan yang ganjil dari yang kedua lalu mengalikan mereka:

Contoh ini mengilustrasi bahwa comprehension bisa bekerja dengan lebih satu koleksi sekaligus. Angka genap pertama dari collection1 akan diambil dan dikalikan dengan tiap angka ganjil dari collection2. Kemudian, integer kedua dari collection1 akan diambil dan dikalikan dan seterusnya. Hasilmya akan menjadi:

Apalagi, hasil nilainya tidak harus integers. Contohnya, kamu bisa mengembalikan tupel yang mengadung integers dari koleksi pertama dan kedua:

Comprehension dengan Opsi "Into"

Hingga titik ini, hasil akhir dari comprehension selalu sebuah daftar. Sebenarnya ini tidak wajib juga. Kamu bisa menspesifikasikan sebuah parameter into yang menerima sekoleksi untuk mengandung hasilnya.

Parameter ini menerima struktur apapun yang mengimplementasikan protokol Collectable, contohnya kita mebuat sebuah map seperti ini:

Di sini saya mengatakan into: Map.new yang juga bisa diganti dengan into: &{}. Dengan mengembalikan tupel {el1, el2} kita pada dasarnya mengatur elemen pertama sebagai sebuah kunci dan yang kedua sebagai nilainya.

Contoh ini tidaklah sangat berguna, namun, mari buat sebuah map dengan sebuah nomor sebagai key dan mengkuadratkannya sebagai sebuah nilai:

Pada contoh ini saya menggunakan modul :math Erlang secara langsung. Lagipula, semua nama modul adalah atom. Sekarang kamu bisa dengan mudah mencari kuadrat dari tiap angka antara 1 sampai 20.

Comprehensions dan Pattern Matching

Hal terakhir untuk disebut adalah kamu bisa melakukan pattern matching di comprehensions juga. Pada beberapa kasus dia bisa jadi sangat mudah.

Anggap kita memiliki map mengandung nama-nama pekerja dan gaji kotor mereka:

Saya ingin membuat sebuah map dimana nama-nama-nya di huruf kecil dan dikonversi ke atom, dan gajinya dihitung menggunakan persentase pajak:

Pada contoh ini kita mendefinisikan sebuah atribut modul @tax dengan sebuah angka asal. Lalu, saya mendekonstruksi data-nya di comprehension menggunakan {name, salary} <- collection. Terakhir, format nama-nya dan kalkulasi gajinya sebutuhnya dan menyimpan hasilnya di map yang baru. Cukup sederhana lagi ekspresif.

Kesimpulan

Pada artikel ini, kita telah melihat cara menggunakan Elixir comprehension. Kamu mungkin butuh beberapa waktu untuk terbiasa dengannya. Konstruksi ini sangat rapih dan pada beberapa kasus bisa cocok lebih baik daripada fungsi seperti map dan filter. Kamu bisa mencari beberapa contoh di Dokumentasi Resmi Elixir dan panduan memulai.

Semoga, kamu menganggap panduan ini berguna dan menyenangkan! Terima kasih telah ikut dengan saya dan sampai jumpa lagi.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.