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

Interoperabilidad Erlang

Uno de los beneficios añadidos de Elixir al estar construido sobre Erlang VM (BEAM) es la gran cantidad de bibliotecas existentes que están disponibles para nosotros. La interoperabilidad nos permite aprovechar esas bibliotecas y la librería estándar de Erlang desde nuestro código Elixir. En esta lección vamos a ver como acceder a la funcionalidad en la librería estándar junto con los paquetes de Erlang de terceros.

Librería Estándar

La extensa biblioteca estándar de Erlang se puede acceder desde cualquier código de Elixir en nuestra aplicación. Los módulos Erlang están representados por átomos en minúsculas como :os y :timer.

Vamos a usar :timer.tc para medir el tiempo de ejecución de una función dada:

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

Para una lista completa de los módulos disponibles, visite el Manual de Referencia Erlang.

Paquetes Erlang

En una lección anterior hemos cubierto Mix y la administración de nuestras dependencias. Incluyendo las bibliotecas de Erlang funciona de la misma manera. En caso de que la biblioteca Erlang no haya sido agregada en [Hex] (https://hex.pm) puedes hacer referencia al repositorio git en su lugar:

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

Ahora podemos acceder a nuestra librería Erlang

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

Diferencias Notables

Ahora que sabemos cómo usar Erlang debemos cubrir algunas de las trampas que vienen con la interoperabilidad de Erlang.

Átomos

Los átomos de Erlang se parecen mucho a sus homólogos Elixir sin los dos puntos (:). Están representados por cadenas en minúsculas y caracteres de subrayado:

Elixir:

:example

Erlang:

example.

Cadenas

En Elixir cuando hablamos de cadenas nos referimos a los binarios codificación en UTF-8. En Erlang, las cadenas siguen utilizando comillas dobles, pero se refieren a listas de caracteres:

Elixir:

iex> is_list('Example')
true
iex> is_binary("Example")
true
iex> <<"Example">> === "Example"
true

Erlang:

1> is_list('Example').
false
1> is_list("Example").
true
1> is_binary("Example").
false
1> is_binary(<<"Example">>).
true

Es importante tener en cuenta que muchas bibliotecas Erlang más antiguas podrían no soportar binarios, por lo que necesitamos convertir cadenas Elixir a lista de caracteres. Afortunadamente esto es fácil de lograr con la función 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

Variables

Elixir:

iex> x = 10
10

iex> x1 = x + 10
20

Erlang:

1> X = 10.
10

2> X1 = X + 1.
11

¡Eso es! Aprovechando Erlang desde dentro de nuestras aplicaciones Elixir es fácil y efectivamente duplica el número de bibliotecas disponibles para nosotros.

¿Encontraste un error o quieres contribuir a la lección? ¡Edita esta lección en GitHub!