Introduzione al linguaggio di programmazione Elisir

Pubblicato: 2022-03-11

Se 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.

Una demo di IEx REPL.

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 .

Uscita da IEx REPL.

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:

Aiutanti IEx.

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:

IEx: controllo dei documenti.

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:

Elenco di directory per questo progetto Elisir.

Ora, per eseguire i test sul modulo Anagram, devi eseguire/compilare i test.

Esecuzione dei test in Elisir.

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.

Compilazione direttamente da una 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.

Ricompilazione in IEx.

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.

I booleani sono solo atomi, come dimostrato tramite IEx.

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.

Interpolazione di stringhe di elisir.

Tieni presente che le stringhe tra virgolette singole sono in realtà un elenco di binari.

Comportamento delle stringhe tra virgolette singole in Elisir.

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.

Restituzione di una funzione Elisir.

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.

Demo di corrispondenza del modello di elisir.

Operatore Pin

Elisir fornisce un modo per forzare sempre la corrispondenza del modello rispetto alla variabile sul lato sinistro, l'operatore pin.

Demo dell'operatore di spille elisir.

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.

Comportamento della lista degli elisir.

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.

Correlati: scoperta di ClojureScript per lo sviluppo front-end