Elixir - Bibliotecas
Elixir fornece excelente interoperabilidade com bibliotecas Erlang. Vamos discutir algumas bibliotecas em breve.
O Módulo Binário
O módulo Elixir String integrado lida com binários codificados em UTF-8. O módulo binário é útil quando você está lidando com dados binários que não são necessariamente codificados em UTF-8. Vamos considerar um exemplo para entender melhor o módulo Binário -
# UTF-8
IO.puts(String.to_char_list("Ø"))
# binary
IO.puts(:binary.bin_to_list "Ø")
Quando o programa acima é executado, ele produz o seguinte resultado -
[216]
[195, 152]
O exemplo acima mostra a diferença; o módulo String retorna pontos de código UTF-8, enquanto: binary lida com bytes de dados brutos.
O Módulo de Criptografia
O módulo criptográfico contém funções de hashing, assinaturas digitais, criptografia e muito mais. Este módulo não faz parte da biblioteca padrão Erlang, mas está incluído na distribuição Erlang. Isso significa que você deve listar: crypto na lista de aplicativos do seu projeto sempre que usá-lo. Vejamos um exemplo usando o módulo de criptografia -
IO.puts(Base.encode16(:crypto.hash(:sha256, "Elixir")))
Quando o programa acima é executado, ele produz o seguinte resultado -
3315715A7A3AD57428298676C5AE465DADA38D951BDFAC9348A8A31E9C7401CB
O Módulo Digraph
O módulo dígrafo contém funções para lidar com gráficos direcionados construídos de vértices e arestas. Depois de construir o gráfico, os algoritmos lá ajudarão a encontrar, por exemplo, o caminho mais curto entre dois vértices, ou loops no gráfico. Observe que as funçõesin :digraph alterar a estrutura do gráfico indiretamente como um efeito colateral, enquanto retorna os vértices ou arestas adicionados.
digraph = :digraph.new()
coords = [{0.0, 0.0}, {1.0, 0.0}, {1.0, 1.0}]
[v0, v1, v2] = (for c <- coords, do: :digraph.add_vertex(digraph, c))
:digraph.add_edge(digraph, v0, v1)
:digraph.add_edge(digraph, v1, v2)
for point <- :digraph.get_short_path(digraph, v0, v2) do
{x, y} = point
IO.puts("#{x}, #{y}")
end
Quando o programa acima é executado, ele produz o seguinte resultado -
0.0, 0.0
1.0, 0.0
1.0, 1.0
O Módulo de Matemática
O módulo matemático contém operações matemáticas comuns que abrangem trigonometria, funções exponenciais e logarítmicas. Vamos considerar o seguinte exemplo para entender como funciona o módulo de matemática -
# Value of pi
IO.puts(:math.pi())
# Logarithm
IO.puts(:math.log(7.694785265142018e23))
# Exponentiation
IO.puts(:math.exp(55.0))
#...
Quando o programa acima é executado, ele produz o seguinte resultado -
3.141592653589793
55.0
7.694785265142018e23
O Módulo da Fila
A fila é uma estrutura de dados que implementa filas FIFO (primeiro a entrar, primeiro a sair) (terminação dupla) com eficiência. O exemplo a seguir mostra como um módulo de fila funciona -
q = :queue.new
q = :queue.in("A", q)
q = :queue.in("B", q)
{{:value, val}, q} = :queue.out(q)
IO.puts(val)
{{:value, val}, q} = :queue.out(q)
IO.puts(val)
Quando o programa acima é executado, ele produz o seguinte resultado -
A
B