Do you want to pick up from where you left of?
Take me there

Interoperabilitas dengan Erlang

Salah satu keuntungan tambahan dari membangun di atas VM Erlang (BEAM) adalah banyaknya pustaka yang tersedia untuk kita pakai. Interoperabilitas memungkinkan kita memanfaatkan pustaka-pustaka tersebut dan juga pustaka standar Erlang dari kode Elixir kita. Dalam pelajaran ini kita akan melihat bagaimana mengakses fungsi dalam librari standar dan juga paket Erlang pihak ketiga.

Pustaka Standar

Pustaka standar Erlang yang luas dapat diakses dari kode Elixir mana pun dalam aplikasi kita. Modul Erlang direpresentasikan oleh atom huruf kecil seperti :os dan :timer.

Mari gunakan :timer.tc untuk mengukur waktu eksekusi fungsi tertentu:

defmodule Example do
  def timed(fun, args) do
    {time, result} = :timer.tc(fun, args)
    IO.puts("Time: #{time} μs")
    IO.puts("Result: #{result}")
  end
end

iex> Example.timed(fn (n) -> (n * n) * n end, [100])
Time: 8 μs
Result: 1000000

Untuk daftar lengkap modul yang tersedia, lihat Erlang Reference Manual.

Paket Erlang

Pada pelajaran sebelumnya kita telah membahas Mix dan mengelola dependensi kita. Menambahkan pustaka Erlang bekerja dengan cara yang sama. Jika pustaka Erlang belum diunggah ke Hex, Anda dapat merujuk ke repositori git sebagai gantinya:

def deps do
  [{:png, github: "yuce/png"}]
end

Sekarang kita bisa mengakses pustaka Erlang tersebut:

png =
  :png.create(%{:size => {30, 30}, :mode => {:indexed, 8}, :file => file, :palette => palette})

Perbedaan yang Nampak

Sekarang setelah kita tahu cara menggunakan Erlang, kita perlu membahas beberapa kendala yang muncul terkait interoperabilitas Erlang.

Atom

Atom Erlang terlihat sangat mirip dengan atom Elixir tanpa tanda titik dua (:). Atom direpresentasikan oleh string huruf kecil dan garis bawah:

Elixir:

:example

Erlang:

example.

String

Dalam Elixir, ketika kita berbicara tentang string, yang kita maksud adalah biner yang dikodekan UTF-8. Dalam Erlang, string masih menggunakan tanda kutip ganda tetapi merujuk pada daftar karakter (char list):

Elixir:

iex> is_list('Example')
true
iex> is_list("Example")
false
iex> is_binary("Example")
true
iex> <<"Example">> === "Example"
true

Erlang:

1> is_list('Example').
false
2> is_list("Example").
true
3> is_binary("Example").
false
4> is_binary(<<"Example">>).
true

Penting untuk dicatat bahwa banyak pustaka Erlang lama mungkin tidak mendukung biner, jadi kita perlu mengkonversi string Elixir ke daftar karakter. Untungnya, ini mudah dilakukan dengan fungsi to_charlist/1:

iex> :string.words("Hello World")
** (FunctionClauseError) no function clause matching in :string.strip_left/2

    The following arguments were given to :string.strip_left/2:

        # 1
        "Hello World"

        # 2
        32

    (stdlib) string.erl:1661: :string.strip_left/2
    (stdlib) string.erl:1659: :string.strip/3
    (stdlib) string.erl:1597: :string.words/2

iex> "Hello World" |> to_charlist() |> :string.words
2

Variabel

Dalam Erlang, variabel diawali dengan huruf kapital dan pengikatan ulang tidak diperbolehkan.

Elixir:

iex> x = 10
10

iex> x = 20
20

iex> x1 = x + 10
30

Erlang:

1> X = 10.
10

2> X = 20.
** exception error: no match of right hand side value 20

3> X1 = X + 10.
20

Selesai! Memanfaatkan Erlang dari dalam aplikasi Elixir kita secara efektif melipatgandakan jumlah pustaka yang tersedia bagi kita.

Caught a mistake or want to contribute to the lesson? Edit this lesson on GitHub!