Introduzione al linguaggio di programmazione Elisir
Pubblicato: 2022-03-11Se hai letto post di blog, thread di notizie di hacker, tweet dei tuoi sviluppatori preferiti o ascoltato podcast, a questo punto probabilmente hai sentito parlare del linguaggio di programmazione Elixir. Il linguaggio è stato creato da Jose Valim, un noto sviluppatore nel mondo open source. Potresti conoscerlo dal framework MVC di Ruby on Rails o dalle gemme di ruby ideate e simple_form su cui lui ei suoi colleghi di Plataformatec hanno lavorato negli ultimi anni.
Secondo Jose Valim, Elixir è nato nel 2011. Ha avuto l'idea di costruire la nuova lingua a causa della mancanza di buoni strumenti per risolvere i problemi di concorrenza nel mondo dei rubini. A quel tempo, dopo aver trascorso del tempo a studiare la concorrenza e le lingue focalizzate distribuite, trovò due lingue che gli piacevano, Erlang e Clojure che girano nella JVM. Gli piaceva tutto ciò che vedeva nel linguaggio Erlang (Erlang VM) e odiava le cose che non vedeva, come il polimorfismo, la metaprogrammazione e gli attributi di estensibilità del linguaggio in cui Clojure era bravo. Quindi, Elixir è nato con questo in mente, per avere un'alternativa per Clojure e un linguaggio dinamico che gira nella macchina virtuale Erlang con un buon supporto per l'estendibilità.
Elixir si descrive come un linguaggio dinamico e funzionale con stato immutabile e un approccio alla concorrenza basato su attori progettato per creare applicazioni scalabili e gestibili con una sintassi semplice, moderna e ordinata. Il linguaggio viene eseguito nella Erlang Virtual Machine, una macchina virtuale distribuita, a prova di battaglia, ad alte prestazioni nota per le sue caratteristiche di bassa latenza e tolleranza agli errori.
Prima di vedere un po' di codice, vale la pena dire che Elixir è stato accettato dalla community che sta crescendo. Se vuoi imparare l'elisir oggi, troverai facilmente libri, biblioteche, conferenze, meetup, podcast, post di blog, newsletter e tutti i tipi di fonti di apprendimento là fuori, così come è stato accettato dai creatori di Erlang.
Vediamo un po' di codice!
Installa l'elisir:
L'installazione di Elixir è semplicissima su tutte le principali piattaforme ed è una battuta nella maggior parte di esse.
Arch Linux
Elixir è disponibile su Arch Linux attraverso i repository ufficiali:
pacman -S elixir
Ubuntu
Installare Elixir in Ubuntu è un po' disordinato. Ma è comunque abbastanza facile.
wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb && sudo dpkg -i erlang-solutions_1.0_all.deb apt-get update apt-get install esl-erlang apt-get install elixir
OS X
Installa Elixir in OS X usando Homebrew.
brew install elixir
Incontra IEx
Al termine dell'installazione, è il momento di aprire la shell. Trascorrerai molto tempo nel tuo guscio se vuoi sviluppare in Elisir.
La shell interattiva di Elixir o IEx è un REPL - (Read Evaluate Print Loop) dove puoi esplorare Elixir. Puoi inserire espressioni lì e verranno valutate dandoti un feedback immediato. Tieni presente che il tuo codice è veramente valutato e non compilato, quindi assicurati di non eseguire profiling né benchmark nella shell.
Il comando di rottura
C'è una cosa importante che devi sapere prima di avviare IEx REPL: come uscire da esso.
Probabilmente sei abituato a premere CTRL+C
per chiudere i programmi in esecuzione nel terminale. Se premi CTRL+C
in IEx REPL, aprirai il menu Break. Una volta nel menu di interruzione, puoi premere di nuovo CTRL+C
per uscire dalla shell e premere a
.
Non mi addentrerò nelle funzioni del menu di interruzione. Ma vediamo alcuni aiutanti IEx!
Aiutanti
IEx fornisce una serie di aiutanti, per elencarli tutti digita: h()
.
E questo è quello che dovresti vedere:
Questi sono alcuni dei miei preferiti, penso che saranno anche i tuoi.
-
h
come abbiamo appena visto, questa funzione stamperà il messaggio di supporto. -
h/1
che è la stessa funzione, ma ora si aspetta un argomento.
Ad esempio, ogni volta che vuoi vedere la documentazione del metodo String
strip/2
puoi facilmente fare:
Probabilmente il secondo helper IEx più utile che utilizzerai durante la programmazione in Elixir è c/2
, che compila un determinato file elixir (o un elenco) e si aspetta come secondo parametro un percorso in cui scrivere i file compilati.
Diciamo che stai lavorando in uno degli esercizi di http://exercism.io/ Elixir, l'esercizio Anagram.
Quindi hai implementato il modulo Anagram
, che ha il metodo match/2
nel file anagram.exs. Da bravo sviluppatore che sei, hai scritto alcune specifiche per assicurarti che tutto funzioni anche come previsto.
Ecco come appare la tua directory attuale:
Ora, per eseguire i test sul modulo Anagram, devi eseguire/compilare i test.
Come hai appena visto, per compilare un file, è sufficiente invocare l'eseguibile elixir
passando come percorso dell'argomento al file che vuoi compilare.
Supponiamo ora di voler eseguire IEx REPL con il modulo Anagram accessibile nel contesto della sessione. Ci sono due opzioni comunemente usate. Il primo è che puoi richiedere il file usando le opzioni -r
, qualcosa come iex -r anagram.exs
. Il secondo, puoi compilare direttamente dalla sessione IEx.
Semplice, proprio così!
Ok, che ne dici se vuoi ricompilare un modulo? Dovresti uscire da IEx, eseguirlo di nuovo e compilare di nuovo il file? No! Se hai una buona memoria, ricorderai che quando abbiamo elencato tutti gli helper disponibili in IEx REPL, abbiamo visto qualcosa su un comando di ricompilazione. Vediamo come funziona.
Nota che questa volta hai passato come argomento il modulo stesso e non il percorso del file.
Come abbiamo visto, IEx ha un sacco di altri utili aiutanti che ti aiuteranno a imparare e capire meglio come funziona un programma Elixir.

Nozioni di base sui tipi di elisir
Numeri
Ci sono due tipi di numeri. Interi di dimensioni arbitrarie e numeri in virgola mobile.
Interi
Gli interi possono essere scritti in base decimale, esadecimale, ottale e binaria.
Come in Ruby, puoi usare il trattino basso per separare gruppi di tre cifre quando scrivi numeri grandi. Ad esempio potresti raddrizzare cento milioni in questo modo:
100_000_000
Ottale:
0o444
Esadecimale:
0xabc
Binario:
0b1011
Galleggia
Floare sono IEEE 754 a doppia precisione. Hanno 16 cifre di precisione e un esponente massimo di circa 10308.
I float vengono scritti utilizzando un punto decimale. Ci deve essere almeno una cifra prima e dopo il punto. Puoi anche aggiungere un esponente finale. Ad esempio 1.0, 0.3141589e1 e 314159.0-e.
Atomi
Gli atomi sono costanti che rappresentano i nomi. Sono valori immutabili. Scrivi un atomo con i due punti iniziali :
e una sequenza di lettere, cifre, trattini bassi e segni di chiocciola @
. Puoi anche scriverli con i due punti iniziali :
e una sequenza arbitraria di caratteri racchiusa tra virgolette.
Gli atomi sono uno strumento molto potente, vengono utilizzati per fare riferimento a funzioni erlang, chiavi e metodi Elixir.
Ecco alcuni atomi validi.
:name, :first_name, :"last name", :===, :is_it_@_question?
booleani
Naturalmente, i booleani sono valori veri e falsi. Ma la cosa bella di loro è alla fine della giornata, sono solo atomi.
stringhe
Per impostazione predefinita, le stringhe in Elisir sono conformi a UTF-8. Per usarli puoi avere un numero arbitrario di caratteri racchiuso tra "
o '
. Puoi anche avere espressioni interpolate all'interno della stringa e caratteri di escape.
Tieni presente che le stringhe tra virgolette singole sono in realtà un elenco di binari.
Funzioni anonime
Come linguaggio funzionale, Elixir ha funzioni anonime come tipo base. Un modo semplice per scrivere una funzione è fn (argument_list) -> body end
. Ma una funzione può avere più corpi con più elenchi di argomenti, clausole di guardia e così via.
Dave Thomas, nel libro Programming Elixir, suggerisce di pensare a fn...end come alle virgolette che circondano una stringa letterale, dove invece di restituire un valore di stringa stiamo restituendo una funzione.
Tuple
Tuple è un array indicizzato immutabile. Sono veloci a restituire le sue dimensioni e lenti ad aggiungere nuovi valori a causa della sua natura immutabile. Quando aggiorni una tupla, stai effettivamente creando una copia completamente nuova della tupla self.
Le tuple sono molto spesso usate come valore di ritorno di un array. Durante la codifica in Elixir vedrai molto spesso questo, {:ok, something_else_here}
.
Ecco come scriviamo una tupla: {?a,?b,?c}
.
Corrispondenza del modello
Non sarò in grado di spiegare tutto ciò che devi sapere sul Pattern Matching, tuttavia ciò che stai per leggere copre molto di ciò che devi sapere per iniziare.
Elisir usa =
come operatore di corrispondenza. Per capire questo, abbiamo bisogno di disimparare ciò che sappiamo =
in altre lingue tradizionali. Nelle lingue tradizionali l'operatore di uguale è per l'assegnazione. In Elisir, gli operatori di uguale servono per la corrispondenza dei modelli.
Quindi, questo è il modo in cui funziona i valori sul lato sinistro. Se sono variabili sono legate al lato destro, se non sono variabili elixir cerca di abbinarle al lato destro.
Operatore Pin
Elisir fornisce un modo per forzare sempre la corrispondenza del modello rispetto alla variabile sul lato sinistro, l'operatore pin.
Elenchi
In Elixir, le liste sembrano matrici come le conosciamo da altre lingue, ma non lo sono. Gli elenchi sono strutture collegate costituite da una testa e una coda.
Elenchi di parole chiave
Gli elenchi di parole chiave sono un elenco di coppie di tuple.
Li scrivi semplicemente come elenchi. Ad esempio: [{:uno, 1}, 2, {:tre, 3}]. C'è una scorciatoia per definire gli elenchi, ecco come appare: [uno: 1, tre: 3].
Per recuperare un elemento da un elenco di parole chiave è possibile utilizzare:
Keyword.get([{:one, 1}, 2, {:three, 3}], :one)
Oppure usa la scorciatoia:
[{:one, 1}, 2, {:three, 3}][:one]
Poiché gli elenchi di parole chiave sono lenti durante il recupero di un valore, si tratta di un'operazione costosa, quindi se si archiviano dati che richiedono un accesso rapido, è necessario utilizzare una mappa.
Mappe
Le mappe sono una raccolta efficiente di coppie chiave/valore. La chiave può avere qualsiasi valore tu voglia come chiave, ma di solito dovrebbe essere dello stesso tipo. Diversamente dagli elenchi di parole chiave, Maps consente solo una voce per una determinata chiave. Sono efficienti man mano che crescono e possono essere utilizzati nella corrispondenza del modello Elixir nelle mappe di uso generale quando è necessario un array associativo.
Ecco come puoi scrivere una mappa:
%{ :one => 1, :two => 2, 3 => 3, "four" => 4, [] => %{}, {} => [k: :v]}
Conclusione
Elixir è fantastico, facile da capire, ha tipi semplici ma potenti e strumenti molto utili che ti aiuteranno quando inizi a imparare. In questa prima parte, abbiamo trattato i vari tipi di dati su cui sono costruiti i programmi Elisir e gli operatori che li alimentano. Nelle parti successive ci addentreremo più a fondo nel mondo di Elixir: programmazione funzionale e simultanea.