Fork me on GitHub

Interoperabilidade com Erlang

Some contents of this translation may be outdated.
Several major changes were applied to the original lesson since the last update.

Um dos benefícios adicionais em se construir em cima da Erlang VM (BEAM) é a abundância de bibliotecas existentes disponíveis para nós. A interoperabilidade nos permite usar essas bibliotecas e a biblioteca padrão Erlang a partir do nosso código Elixir. Nessa lição, nós vamos ver como acessar funcionalidades da biblioteca padrão juntamente com pacotes Erlang de terceiros.

Sumário

Biblioteca padrão

A extensiva biblioteca padrão Erlang pode ser acessada de qualquer código Elixir em nossa aplicação. Módulos Erlang são representados por átomos em caixa baixa como :os e :timer.

Vamos usar :timer.tc para medir o tempo de execução de uma determinada função:

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

Para uma lista completa de módulos disponíveis, olhe o Manual de referência Erlang.

Pacotes Erlang

Em uma lição anterior nós cobrimos Mix e como gerenciar nossas dependências, incluindo bibliotecas Erlang que funcionam da mesma forma. No evento a biblioteca Erlang não foi publicada no Hex. Nesse caso você pode usar uma referência ao repositório git:

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

Agora podemos acessar nossa biblioteca Erlang:

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

Diferenças notáveis

Agora que sabemos como usar Erlang nós devemos cobrir alguns contrapontos que vem com a interoperabilidade com Erlang.

Átomos

Átomos Erlang são similares aos em Elixir, só que sem os dois pontos (:). Eles são representados por strings e underscores em caixa baixa:

Elixir:

:example

Erlang:

example.

Strings

Em Elixir quando falamos strings nós queremos dizer binários codificados em UTF-8. Em Erlang, strings continuam usando aspas mas referem-se a listas de caracteres:

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

É importante notar que muitas bibliotecas Erlang antigas podem não suportar binários, então precisamos converter strings Elixir em lista de caracteres. Felizmente isso é fácil de conseguir com a função 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

Variáveis

Elixir:

iex> x = 10
10

iex> x1 = x + 10
20

Erlang:

1> X = 10.
10

2> X1 = X + 1.
11

É isso! Aproveitar Erlang a partir da nossa aplicação Elixir é fácil e efetivamente dobra o número de bibliotecas disponíveis para nós.



Compartilhe essa página