Elixir - Bibliotecas
Elixir proporciona una excelente interoperabilidad con las bibliotecas de Erlang. Analicemos brevemente algunas bibliotecas.
El módulo binario
El módulo Elixir String integrado maneja binarios codificados en UTF-8. El módulo binario es útil cuando se trata de datos binarios que no están necesariamente codificados en UTF-8. Consideremos un ejemplo para comprender mejor el módulo binario:
# UTF-8
IO.puts(String.to_char_list("Ø"))
# binary
IO.puts(:binary.bin_to_list "Ø")
Cuando se ejecuta el programa anterior, produce el siguiente resultado:
[216]
[195, 152]
El ejemplo anterior muestra la diferencia; el módulo String devuelve puntos de código UTF-8, mientras que: binary trata con bytes de datos sin procesar.
El módulo criptográfico
El módulo de cifrado contiene funciones de hash, firmas digitales, cifrado y más. Este módulo no forma parte de la biblioteca estándar de Erlang, pero se incluye con la distribución de Erlang. Esto significa que debe incluir: crypto en la lista de aplicaciones de su proyecto siempre que lo use. Veamos un ejemplo usando el módulo criptográfico:
IO.puts(Base.encode16(:crypto.hash(:sha256, "Elixir")))
Cuando se ejecuta el programa anterior, produce el siguiente resultado:
3315715A7A3AD57428298676C5AE465DADA38D951BDFAC9348A8A31E9C7401CB
El módulo Digraph
El módulo de dígrafos contiene funciones para tratar con gráficos dirigidos construidos con vértices y aristas. Después de construir el gráfico, los algoritmos ayudarán a encontrar, por ejemplo, el camino más corto entre dos vértices o bucles en el gráfico. Tenga en cuenta que las funcionesin :digraph alterar la estructura del gráfico indirectamente como un efecto secundario, mientras se devuelven los vértices o bordes agregados.
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
Cuando se ejecuta el programa anterior, produce el siguiente resultado:
0.0, 0.0
1.0, 0.0
1.0, 1.0
El módulo de matemáticas
El módulo de matemáticas contiene operaciones matemáticas comunes que cubren trigonometría, funciones exponenciales y logarítmicas. Consideremos el siguiente ejemplo para comprender cómo funciona el módulo de matemáticas:
# Value of pi
IO.puts(:math.pi())
# Logarithm
IO.puts(:math.log(7.694785265142018e23))
# Exponentiation
IO.puts(:math.exp(55.0))
#...
Cuando se ejecuta el programa anterior, produce el siguiente resultado:
3.141592653589793
55.0
7.694785265142018e23
El módulo de cola
La cola es una estructura de datos que implementa colas FIFO (primero en entrar, primero en salir) (de dos extremos) de manera eficiente. El siguiente ejemplo muestra cómo funciona un módulo de cola:
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)
Cuando se ejecuta el programa anterior, produce el siguiente resultado:
A
B