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 adalah banyaknya librari yang sudah ada yang bisa kita pakai. Interoperabilitas memungkinkan kita memanfaatkan librari-librari tersebut dan juga librari standar Erlang dari code Elixir kita. Dalam pelajaran ini kita akan melihat bagaimana mengakses fungsi dalam librari standar dan juga paket Erlang buatan pihak lain (third party).

Librari Standar

Librari standar Erlang yang luas itu dapat diakses dari code Elixir di dalam aplikasi kita. Modul-modul Erlang direpresentasikan dengan atom huruf kecil seperti :os dan :timer.

Mari gunakan :timer.tc untuk mengukur waktu eksekusi dari sebuah fungsi yang ada:

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

Dalam pelajaran sebelumnya kita membahas Mix dan menata dependensi kita. Librari Erlang juga dengan cara yang sama. Jika librari Erlang tersebut belum dimasukkan ke Hex anda bisa merujuk ke repositori git:

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

Sekarang kita bisa mengakses librari Erlang kita:

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

Perbedaan yang Nampak

Sekarang setelah kita tahu cara menggunakan Erlang kita harus membahas sebagian kejutan (gotcha) yang ada.

Atom

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

Elixir:

:example

Erlang:

example.

String

Dalam Elixir ketika kita berbicara tentang string yang kita maksud adalah binari yang dienkode dengan UTF-8. Dalam Erlang, string tetap pakai kutip ganda tetapi merujuk ke 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

Adalah penting dicatat bahwa banyak librari Erlang yang lawas mungkin tidak mendukung binary sehingga kita perlu mengkonversi string Elixir ke char list. Untungnya hal ini mudah dikerjakan 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

Elixir:

iex> x = 10
10

iex> x1 = x + 10
20

Erlang:

1> X = 10.
10

2> X1 = X + 1.
11

Selesai! Menggunakan Erlang dari dalam aplikasi Elixir kita adalah mudah dan secara efektif melipatgandakan jumlah librari yang tersedia untuk kita.

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