Pengantar Elixir Lang

Diterbitkan: 2015-02-27

Pengantar Bahasa Pemrograman Elixir (Dan Mengapa Saya Menyukainya)

Saya menulis artikel beberapa bulan yang lalu memperkenalkan Anda ke Golang, dan mengapa saya sangat menyukainya. Meskipun saya memang masih menyukainya, akhir-akhir ini saya bermain-main dengan bahasa baru; Eliksir. Saya membeli buku Programming Elixir dan telah mengikutinya. Saya sudah menyukai Elixir dan berharap untuk menunjukkan alasannya di artikel ini.

Sementara saya bekerja untuk Couchbase beberapa tahun yang lalu, saya sangat tertarik pada Erlang, dan sistem terdistribusi. Bagi saya, Erlang membingungkan. Ketika saya melihat Elixir, saya langsung tahu bahwa saya menyukai sesuatu yang baik. Elixir dirinci sebagai bahasa fungsional dan bersamaan yang berjalan di atas Erlang VM.

Saya sering mendengar, orang mengatakan Elixir adalah 'Ruby untuk Erlang' dll. Teori ini tidak sepenuhnya salah, tetapi secara realistis, terutama hanya sintaks Elixir yang dipengaruhi oleh Ruby, karena tidak berbagi banyak konstruksi pemrograman yang sama. Hal ini, tentu saja, mirip dengan cara Erlang, dengan itu dibangun di atas VM Erlang, dan memberi kita akses langsung ke primitif Erlang secara asli.

Bagaimanapun, tanpa ragu-ragu lebih lanjut, mari selami dan lanjutkan dengan beberapa Elixir.

Instalasi

Jika Anda menjalankan OSX, penginstalan semudah menggunakan Homebrew:
~ brew update
~ brew install erlang
~ brew install elixir

Setelah Anda selesai melakukannya, Anda seharusnya dapat menjalankan:

~ elixir -v
> Elixir 1.0.2

Sekarang Elixir terinstal dengan benar, kita dapat membuka Elixir Interaktif dan bermain-main dengan beberapa tipe umum dasar.

Jenis dalam Elixir

Mulai REPL Elixir Interaktif dengan memasukkan
> iex

Variabel:

iex(1)> name = "rbin"
#=> "rbin"

atom:

Dalam Elixir, Atom adalah konstanta di mana namanya adalah nilainya sendiri.
iex(2)> :this_is_an_atom
#=> :this_is_an_atom
iex(3)> :my_atom == :atom
#=> false

Tupel:

Kami menggunakan notasi Curly Brace untuk mendefinisikan Tuples. Di Elixir, Tuple disimpan segera di memori, artinya mendapatkan ukuran Tuple, atau mengakses elemen Tuple dengan cepat, tetapi memperbarui atau menambahkan elemen mahal karena memerlukan menyalin seluruh Tuple di memori.

iex(4)> tuple = {:hello, "world"}
#=> {:hello, "world"}
iex(5)> elem(tuple, 1)
#=> "world"

Daftar:

Di Elixir, daftar disimpan dalam memori, sebagai daftar tertaut. Kita dapat memperbarui daftar secara sepele dengan menambahkan elemen, tetapi menambahkan elemen lebih mahal, karena kita perlu menelusuri seluruh daftar untuk mengetahui ukurannya.

iex(8)> list = [1, 2, :atom]
#=> [1, 2, :atom]
iex(9)> ["string"] ++ list
#=> ["string", 1, 2, :atom]
iex(10)> list ++ [31]
#=> [1, 2, :atom, 31]

Ada fungsi built-in yang sangat berguna untuk digunakan dengan daftar, termasuk mendapatkan Head & Tail dari daftar.

iex(11)> hd(list)
#=> 1
iex(12)> tl(list)
#=> [2, :atom]

Fungsi Anonim:

Dalam Elixir, fungsi adalah warga negara kelas satu, artinya kita dapat meneruskan fungsi sebagai argumen ke fungsi lain. Di bawah ini, kita akan mendefinisikan sebuah variabel bernama add yang berisi sebuah fungsi, yang kemudian akan kita berikan sebagai argumen ke is_function/1 func .

iex(14)> add = fn a, b -> a + b end
#Function<12.90072148/2 in :erl_eval.expr/5>

iex(15)> add.(13, 31)
#=> 44

iex(16)> is_function(add)
#=> true

Mengatur Proyek Kami (Campuran)

Elixir dikirimkan dengan alat yang sangat berguna bernama Mix. Mix adalah alat build yang memungkinkan kita untuk menghasilkan, mengatur, mengkompilasi, dan menguji proyek kita dengan sangat mudah. Itu juga memudahkan kita untuk mengelola dependensi. (Selalu menjadi subjek yang sensitif!) Untuk membuat proyek baru dengan Mix, kita cukup melakukan hal berikut:
~ mix new myapp --module MyApp
Ini akan membuat direktori bernama myapp dengan beberapa file di dalamnya. Itu juga akan mendefinisikan modul MyApp di dalam lib/myapp.ex .
* creating README.md
* creating .gitignore
* creating mix.exs
* creating config
* creating config/config.exs
* creating lib
* creating lib/myapp.ex
* creating test
* creating test/test_helper.exs
* creating test/myapp_test.exs


Your mix project was created successfully.
You can use mix to compile it, test it, and more:

cd myapp
mix test

Seperti yang bisa kita lihat, kita mendapatkan semua file yang dibutuhkan untuk struktur proyek dasar. Saya pikir ini adalah salah satu fitur yang lebih bagus yang tersedia yang dikirimkan bersama Elixir. Memiliki alat manajemen proyek sangat berguna dan sangat menghemat waktu.

File mix.exs adalah file utama yang digunakan untuk mengonfigurasi proyek kami, dan mengelola dependensi, dll. Kami mendapatkan test/folder , di mana kami dapat menulis tes yang sangat mirip ruby ​​untuk proyek kami. Kami tentu saja mendapatkan lib/folder , yang berisi file sumber ke proyek kami. Jika kami menjalankan uji campuran di aplikasi kami, kami mendapatkan yang berikut:
$ mix test
Compiled lib/myapp.ex
Generated myapp.app
.

Finished in 0.04 seconds (0.04s on load, 0.00s on tests)
1 tests, 0 failures

Randomized with seed 543313

Konkurensi

Sama seperti Erlang, Elixir menggunakan model 'Aktor' untuk konkurensi. Semua kode kami berjalan di dalam Processes , dan proses ini terisolasi satu sama lain. Kami dapat membuat program yang sepenuhnya bersamaan di Elixir dengan memunculkan Proses dan mengirim dan menerima pesan di antara mereka.

Di Elixir, kami memulai proses dengan menggunakan fungsi spawn , yang mengambil fungsi lain sebagai argumen.

iex(1)> spawn(fn -> IO.puts 1 + 1 end)
#=> 2
#PID<0.55.0>

Seperti yang Anda lihat, kami memunculkan proses yang menghasilkan 1 + 1, dan juga mengembalikan ID Prosesnya. Mengembalikan ID Proses ini berguna, karena kita dapat menetapkannya ke variabel, dan menggunakannya untuk mengirim pesan ke proses. Sebelum kita melakukannya, kita perlu membuat mekanisme penerimaan untuk mencapai pesan yang kita kirim ke proses. (Kita dapat melanjutkan dan melakukan ini dalam sesi Interative Elixir , baris demi baris.)

Setelah kita selesai melakukannya, kita dapat membuat proses yang mengevaluasi area_loop , dan menetapkannya ke pid .

pid = spawn(fn -> Geometry.area_loop() end)
#=> #PID<0.40.0>

Kami kemudian dapat mengirim pesan ke pid bahwa kode standar kami akan cocok, tergantung pada apakah ia menerima atom :rectangle , atau atom :circle .

send pid, {:rectangle, 2, 3}
#=> Area = 6
# {:rectangle,2,3}

send pid, {:circle, 2}
#=> Area = 12.56000000000000049738
# {:circle,2}

Kita dapat memeriksa untuk melihat apakah proses masih berjalan menggunakan Process.alive? fungsi.

Process.alive?(pid)
#=> false

Kesimpulan

Kami bahkan belum menggores permukaan di blog ini. Ada begitu banyak fitur luar biasa di Elixir, saya harap Anda akan terus memeriksanya sendiri. Saya telah membuat daftar beberapa sumber belajar di bawah ini untuk membantu Anda, tetapi sebelum Anda memulai dan menyelami, berikut adalah beberapa hal favorit pribadi saya tentang Elixir:

  • Itu mudah dipahami, dengan sintaksis seperti ruby , dan primitif seperti Erlang
  • Ada komunitas fantastis di baliknya
  • Model konkurensinya akrab bagi saya, dan sangat kuat
  • Campuran adalah anugerah, dan menghemat BANYAK waktu
  • Elixir mendorong kami untuk mendokumentasikan semuanya
  • Itu membuat membangun aplikasi terdistribusi menjadi medan perang yang jauh lebih membingungkan
  • Saya bisa melihat Elixir berjalan jauh.

Sumber daya

Beberapa sumber yang menurut saya sangat berguna dalam waktu singkat saya mempelajari Elixir:

  • http://elixir-lang.org/getting-started/introduction.html
  • https://pragprog.com/book/elixir/programming-elixir
  • https://teamgaslight.com/blog/the-best-resources-for-learning-elixir
  • http://exercism.io

* Majulah dan teguk Elixir itu! – @rbin*