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

Interoperabilita s Erlangom

Jednou z výhod toho, že Elixir je postavený na základoch z Erlang VM (BEAM) je množstvo existujúcich knižníc, ktoré máme k dispozícii. Interoperabilita nám umožňuje používať tieto knižnice a štandardnú knižnicu Erlangu v našom Elixir kóde. V tejto lekcii sa pozrieme na to ako pristupovať k funkcionalite štandardnej knižnice a zároveň aj ku knižniciam tretích strán z Erlangu.

Štandardná Knižnica

Rozsiahla štandardná knižnica Erlangu je dostupná z akéhokoľvek Elixir kódu v našej aplikácii. Moduly Erlangu sú reprezentované atómami s malými písmenami ako napríklad :os alebo :timer.

Skúsme použiť :timer.tc, aby sme odmerali ako dlho trvalo vykonanie danej funkcie:

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

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

Pre kompletný zoznam dostupných modulov je k dispozícii Príručka Erlangu.

Balíčky Erlangu

V predchádzajúcej lekcii sme zistili ako funguje Mix a správa závislostí projektu. Pridávanie Erlang knižníc funguje rovnakým spôsobom. V prípade, že Erlang knižnica nebola pridaná na Hex môžeme ako odkaz na ňu použiť git repozitár:

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

Teraz môžeme pristupovať k našej Erlang knižnici:

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

Významné Rozdiely

Now that we know how to use Erlang we should cover some of the gotchas that come with Erlang interoperability. Teraz, keď vieme ako používať Erlang, mali by sme sa oboznámiť s výnimkami, ktoré prináša interoperabilita Erlangu.

Atómy

Atómy v Erlangu vyzerajú ako ich kolegovia v Elixire, ale bez dvojbodky (:). Sú reprezentované malými písmenami a môžu obsahovať podtržníky:

Elixir:

:example

Erlang:

example.

Reťazce

Keď v Elixire hovoríme o reťazcoch myslíme tým na binaries kódované do UTF-8. V Erlangu reťazce tiež používajú dvojité úvodzovky, ale predstavujú char listy:

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

Je dôležité poznamenať, že veľa starších Erlang knižníc nemusí podporovať binaries tak vtedy musíme prekonvertovať Elixir reťazce na char listy. To dosiahneme jednoducho použitím funkcie to_charlist/1:

iex> :string.words("Hello World")
** (FunctionClauseError) no function clause matching in :string.strip_left/2
    (stdlib) string.erl:380: :string.strip_left("Hello World", 32)
    (stdlib) string.erl:378: :string.strip/3
    (stdlib) string.erl:316: :string.words/2

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

Premenné

Elixir:

iex> x = 10
10

iex> x1 = x + 10
20

Erlang:

1> X = 10.
10

2> X1 = X + 1.
11

To je všetko! Používanie Erlangu v našich Elixir aplikáciach je jednoduché a efektívne zdvojnásobuje počet nám dostupných knižníc.

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