Fork me on GitHub

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.

Tabla de contenidos

Librería Estándar

A 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}ms"
    IO.puts "Result: #{result}"
  end
end

iex> Example.timed(fn (n) -> (n * n) * n end, [100])
Time: 8ms
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, incluir 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_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

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.


Share This Page