Fork me on GitHub

Współpraca z Erlangiem

Jedną z zalet działania w ramach maszyny wirtualnej Erlanga jest bogactwo istniejących rozwiązań. Interoperacyjność pozwala nam na wykorzystanie tych rozwiązań, jak i standardowej biblioteki Erlanga w naszym Elixirowym kodzie. W tej lekcji przyjrzymy się, jak możemy łączyć nasz kod z bibliotekami stworzonymi w Erlangu.

Spis treści

Biblioteka standardowa

Do kodu napisanego w Erlangu możemy odwołać się w dowolnym miejscu naszego kodu. Moduły Erlanga są reprezentowane przez atomy, pisane małymi literami, na przykład :os czy :timer.

Użyjmy :timer.tc by zmierzyć czas wykonania funkcji:

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

Pełna lista modułów jest dostępna w podręczniku Erlang Reference Manual.

Pakiety Erlanga

W jednej z poprzednich lekcji poznaliśmy narzędzie Mix służące do zarządzania zależnościami. Dodawanie zależności do bibliotek Erlangowych działa w taki sam sposób. Jedyny wyjątek stanowi to, że biblioteki Erlanga nie są opublikowane w Hex, ale można się do nich odwołać podając nazwę repozytorium na githubie:

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

I teraz mamy dostęp do biblioteki napisanej w erlangu:

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

Najważniejsze różnice

Jak już wiemy jak korzystać z Erlanga musimy jeszcze poznać pewne pułapki wynikające z tego rozwiązania.

Atomy

Atomy w Erlangu wyglądają bardzo podobnie do tych z Elixira. Nie zawierają dwukropka (:), są pisane małymi literami i można w nich użyć znaku podkreślenia:

Elixir:

:example

Erlang:

example.

Ciągi znaków

W Elixirze, gdy mówimy o ciągach znaków mamy na myśli dane bitowe interpretowane jako UTF-8. W Erlangu ciągi znaków też używają cudzysłowów, ale są listami znaków:

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

Musimy pamiętać, że wiele starszych bibliotek Erlanga, nie wspiera formy binarnej i musimy zamienić ciągi znaków z Elixira na listy. Na całe szczęście mamy do tego odpowiednią funkcję to_char_list/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_char_list |> :string.words
2

Zmienne

Elixir:

iex> x = 10
10

iex> x1 = x + 10
20

Erlang:

1> X = 10.
10

2> X1 = X + 1.
11

I to wszystko! Możliwość wykorzystania Erlanga z kodu aplikacji pisanych w Elixirze jest proste i efektywnie zwiększa ilość bibliotek, które możemy wykorzystać.


Podziel się