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