Elisir - Biblioteche
Elixir fornisce un'eccellente interoperabilità con le librerie Erlang. Parliamo brevemente di alcune biblioteche.
Il modulo binario
Il modulo Elixir String integrato gestisce i file binari con codifica UTF-8. Il modulo binario è utile quando si ha a che fare con dati binari che non sono necessariamente codificati in UTF-8. Consideriamo un esempio per comprendere ulteriormente il modulo Binario -
# UTF-8
IO.puts(String.to_char_list("Ø"))
# binary
IO.puts(:binary.bin_to_list "Ø")
Quando il programma di cui sopra viene eseguito, produce il seguente risultato:
[216]
[195, 152]
L'esempio sopra mostra la differenza; il modulo String restituisce codepoint UTF-8, mentre: binary si occupa di byte di dati grezzi.
Il modulo Crypto
Il modulo crittografico contiene funzioni di hashing, firme digitali, crittografia e altro ancora. Questo modulo non fa parte della libreria standard Erlang, ma è incluso nella distribuzione Erlang. Ciò significa che devi elencare: crypto nell'elenco delle applicazioni del tuo progetto ogni volta che lo usi. Vediamo un esempio usando il modulo crypto -
IO.puts(Base.encode16(:crypto.hash(:sha256, "Elixir")))
Quando il programma di cui sopra viene eseguito, produce il seguente risultato:
3315715A7A3AD57428298676C5AE465DADA38D951BDFAC9348A8A31E9C7401CB
Il modulo Digraph
Il modulo digraph contiene funzioni per gestire grafi diretti costruiti con vertici e archi. Dopo aver costruito il grafo, gli algoritmi presenti aiuteranno a trovare, ad esempio, il percorso più breve tra due vertici o loop nel grafo. Nota che il file functionsin :digraph alterare la struttura del grafico indirettamente come effetto collaterale, restituendo i vertici o gli spigoli aggiunti.
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 il programma di cui sopra viene eseguito, produce il seguente risultato:
0.0, 0.0
1.0, 0.0
1.0, 1.0
Il modulo matematico
Il modulo di matematica contiene operazioni matematiche comuni che coprono funzioni trigonometriche, esponenziali e logaritmiche. Consideriamo il seguente esempio per capire come funziona il modulo Math:
# Value of pi
IO.puts(:math.pi())
# Logarithm
IO.puts(:math.log(7.694785265142018e23))
# Exponentiation
IO.puts(:math.exp(55.0))
#...
Quando il programma di cui sopra viene eseguito, produce il seguente risultato:
3.141592653589793
55.0
7.694785265142018e23
Il modulo della coda
La coda è una struttura di dati che implementa le code FIFO (first-in first-out) (a doppia estremità) in modo efficiente. L'esempio seguente mostra come funziona un modulo Queue:
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 il programma di cui sopra viene eseguito, produce il seguente risultato:
A
B