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

Kesalingbolehgunaan (Interoperability) Dengan Erlang

Salah satu faedah tambahan daripada membina di atas Erlang VM (BEAM) ialah lambakan pustaka sedia ada yang tersedia untuk kita. Kesalingbolehgunaan(Interoperability) mengupayakan kita untuk menuilkan(leverage) pustaka-pustaka tersebut dan pustaka rasmi Erlang daripada kod Elixir kita. Di dalam pelajaran ini kita akan melihat bagaimana untuk mencapai kefungsian di dalam pustaka rasmi dan juga pustaka-pustaka pihak ketiga Erlang.

Pustaka Rasmi

Pustaka rasmi Erlang yang besar boleh dicapai dari mana-mana kod Elixir di dalam aplikasi kita. Modul-modul Erlang diwakilkan oleh atom-atom berhuruf kecil seperti :os dan :timer.

Mari kita gunakan :timer.tc untuk mengukur masa yang digunakan untuk menjalankan satu fungsi:

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

Sila lihat Erlang Reference Manual untuk mendapatkan senarai lengkap modul-modul yang disediakan.

Pakej Erlang

Di dalam pelajaran lepas kita telah melihat Mix dan cara-cara menguruskan komponen-komponen sokongan(dependencies). Pustaka Erlang juga boleh diuruskan dengan cara yang sama. Jika pustaka Erlang yang diperlukan itu masih belum dimasukkan ke dalam Hex, anda boleh membuat rujukan terus ke repositori git:

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

Sekarang kita boleh mencapai pustaka Erlang tersebut:

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

Perbezaan Nyata

Oleh kerana sekarang kita telah tahu bagaimana untuk menggunakan pustaka Elixir kita patut melihat beberapa isu yang didatangkan oleh kesalingbolehgunaan dengan Erlang.

Atom

Atom-atom Erlang nampak lebih kurang sama dengan atom Elixir, cuma tanpa tanda titik bertindih (:). Mereka diwakili oleh string huruf kecil dan garis bawah.

Elixir:

:example

Erlang:

example.

String

Apabila kita bercakap mengenai string di dalam Elixir, kita merujuk kepada ‘UTF-8 encoded binaries’. Di dalam Erlang, string masih ditandakan menggunakan tanda ungkapan berganda (“”) tetapi merujuk kepada list aksara.

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 diperhatikan bahawa banyak pustaka Erlang yang lama mungkin tidak menyokong ‘binary’ jadi kita perlu menukarkan string Elixir kepada list aksara. Nasib baik ianya mudah untuk dilakukan dengan menggunakan 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

Pembolehubah

Elixir:

iex> x = 10
10

iex> x1 = x + 10
20

Erlang:

1> X = 10.
10

2> X1 = X + 1.
11

Itu sahaja! Menuilkan kelebihan Erlang dari dalam aplikasi Elixir adalah cukup mudah dan secara tidak lansung menggandakan jumlah pustaka yang tersedia untuk kita.

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