Interopérabilité Erlang
Un des bénéfices de coder par dessus la VM Erlang (BEAM) provient de la pléthore de librairies existantes disponibles. L’interoperabilité permet d’utiliser ces librairies et la librairie standard d’Erlang depuis notre code Elixir. Dans cette leçon nous allons voir comment nous pouvons accéder aux fonctionnalités de la librairie standard d’Erlang mais aussi les librairies tierces d’Erlang.
Librairie standard
On accède à la librairie standard étendue d’Erlang depuis n’importe quel code Elixir dans notre application.
Les modules d’Erlang sont représentés par des atomes en minuscule comme :os
et :timer
.
Utilisons :timer.rc
pour chronométrer l’exécution d’une fonction:
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
Pour connaître la liste complètes des modules disponibles, voir la documentation de la librairie standard d’Erlang.
Librairies tierces d’Erlang
Dans une leçon précédente nous avons couvert Mix et la gestion de nos dépendances. Les librairies d’Erlang fonctionnent de la même façon. Dans l’éventualité où la librairie Erlang n’existe pas sur Hex vous pouvez faire une référence au dépôt git à la place.
def deps do
[{:png, github: "yuce/png"}]
end
Nous pouvons ensuite accéder à la librairie Erlang :
png =
:png.create(%{:size => {30, 30}, :mode => {:indexed, 8}, :file => file, :palette => palette})
Différences notables
Maintenant que nous connaissons comment utiliser Erlang nous devons couvrir quelques-uns des pièges qui se cachent avec l’interopérabilité d’Erlang.
Atomes
Les atomes Erlang sont similaires à ceux d’Elixir sans le double point (:
) :
Ils sont représentés par des chaines de caractères en minuscule et des tiret bas :
Elixir:
:example
Erlang:
example.
Chaînes
Les chaînes dans Elixir sont en fait des suites d’octets encodés en UTF-8. Pour Erlang les chaînes utilisent aussi les double guillemets mais font références à une liste de caractères+:
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
Il est important de noter que certaines librairies anciennes d’Erlang peuvent ne pas supportes les suites d’octets donc nous devons convertir les chaînes Elixir en listes de caractères.
Heureusement la conversion est facile avec la fonction 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
Avec Erlang les variables commencent par une lettre majuscule et la re-déclaration n’est pas autorisée.
Elixir:
iex> x = 10
10
iex> x = 20
20
iex> x1 = x + 10
30
Erlang:
1> X = 10.
10
2> X = 20.
** exception error: no match of right hand side value 20
3> X1 = X + 10.
20
Et voilà! Tirer parti d’Erlang depuis nos applications Elixir est facile et double le nombre de librairies disponibles.
Caught a mistake or want to contribute to the lesson? Edit this lesson on GitHub!