Noțiuni introductive cu limbajul de programare Elixir
Publicat: 2022-03-11Dacă ați citit postări pe blog, fire de știri despre hackeri, tweet-urile dezvoltatorilor dvs. preferați sau ați ascultat podcasturi, în acest moment probabil ați auzit despre limbajul de programare Elixir. Limbajul a fost creat de Jose Valim, un dezvoltator binecunoscut în lumea open-source. S-ar putea să-l cunoașteți din cadrul Ruby on Rails MVC sau din design și simple_form ruby gems la care el și colegii săi de la Plataformatec au lucrat în ultimii ani.
Potrivit lui Jose Valim, Elixir s-a născut în 2011. A avut ideea de a construi noul limbaj din cauza lipsei de instrumente bune pentru a rezolva problemele de concurență din lumea rubinului. La acel moment, după ce a petrecut timp studiind concurența și a distribuit limbi focalizate, a găsit două limbi care îi plăceau, Erlang și Clojure, care rulează în JVM. Îi plăcea tot ce vedea în limbajul Erlang (Erlang VM) și ura lucrurile pe care nu le vedea, cum ar fi polimorfismul, metaprogramarea și atributele de extensibilitate a limbajului la care Clojure era bun. Deci, Elixir s-a născut cu asta în minte, pentru a avea o alternativă pentru Clojure și un limbaj dinamic care rulează în mașina virtuală Erlang cu suport bun de extensibilitate.
Elixir se descrie ca un limbaj dinamic, funcțional, cu o stare imuabilă și o abordare a concurenței bazată pe actor, concepută pentru a construi aplicații scalabile și care pot fi întreținute cu o sintaxă simplă, modernă și ordonată. Limbajul rulează în Erlang Virtual Machine, o mașină virtuală distribuită, rezistentă la luptă, de înaltă performanță, cunoscută pentru caracteristicile sale de latență scăzută și toleranță la erori.
Înainte de a vedea ceva cod, merită să spunem că Elixir a fost acceptat de comunitatea care este în creștere. Dacă doriți să învățați Elixir astăzi, veți găsi cu ușurință cărți, biblioteci, conferințe, întâlniri, podcasturi, postări pe blog, buletine informative și tot felul de surse de învățare, așa cum a fost acceptat de creatorii Erlang.
Să vedem niște coduri!
Instalați Elixir:
Instalarea Elixir este foarte ușoară pe toate platformele majore și este o singură linie în majoritatea acestora.
Arch Linux
Elixir este disponibil pe Arch Linux prin intermediul depozitelor oficiale:
pacman -S elixir
Ubuntu
Instalarea Elixir în Ubuntu este puțin grea. Dar este destul de ușor, totuși.
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
Instalați Elixir în OS X folosind Homebrew.
brew install elixir
Faceți cunoștință cu IEx
După finalizarea instalării, este timpul să vă deschideți shell-ul. Vei petrece mult timp în carapacea ta dacă vrei să te dezvolți în Elixir.
Învelișul interactiv al Elixir sau IEx este un REPL - (Read Evaluate Print Loop) unde puteți explora Elixir. Puteți introduce expresii acolo și acestea vor fi evaluate oferindu-vă feedback imediat. Rețineți că codul dvs. este cu adevărat evaluat și nu este compilat, așa că asigurați-vă că nu rulați profiluri sau benchmark-uri în shell.
Comanda de pauză
Există un lucru important pe care trebuie să-l știi înainte de a începe IEx REPL - cum să ieși din el.
Probabil că sunteți obișnuit să apăsați CTRL+C
pentru a închide programele care rulează în terminal. Dacă apăsați CTRL+C
în IEx REPL, veți deschide meniul Break. Odată ajuns în meniul de pauză, puteți apăsa din nou CTRL+C
pentru a ieși din shell, precum și apăsând a
.
Nu mă voi scufunda în funcțiile meniului de pauză. Dar, să vedem câțiva ajutoare IEx!
Ajutoare
IEx oferă o grămadă de ajutoare, pentru a le lista pe toți, tastați: h()
.
Și asta ar trebui să vezi:
Acestea sunt unele dintre preferatele mele, cred că vor fi și ale tale.
-
h
așa cum tocmai am văzut, această funcție va imprima mesajul de ajutor. -
h/1
care este aceeași funcție, dar acum așteaptă un argument.
De exemplu, ori de câte ori doriți să vedeți documentația metodei String
strip/2
puteți face cu ușurință:
Probabil cel de-al doilea ajutor IEx cel mai util pe care îl veți folosi în timp ce programați în Elixir este c/2
, care compilează un anumit fișier elixir (sau o listă) și așteaptă ca al doilea parametru o cale pentru a scrie fișierele compilate.
Să presupunem că lucrezi într-unul dintre exercițiile http://exercism.io/ Elixir, exercițiul Anagramă.
Deci ați implementat modulul Anagram
, care are metoda match/2
în fișierul anagram.exs. În calitate de dezvoltator bun care sunteți, ați scris câteva specificații pentru a vă asigura că totul funcționează, de asemenea, conform așteptărilor.
Iată cum arată directorul dvs. actual:
Acum, pentru a rula testele pe modulul Anagram, trebuie să rulați/compilați testele.
După cum tocmai ați văzut, pentru a compila un fișier, pur și simplu invocați executabilul elixir
care trece drept cale argument către fișierul pe care doriți să-l compilați.
Acum să presupunem că doriți să rulați IEx REPL cu modulul Anagram accesibil în contextul sesiunii. Există două opțiuni utilizate în mod obișnuit. Primul este că puteți solicita fișierul folosind opțiunile -r
, ceva de genul iex -r anagram.exs
. Al doilea, îl puteți compila chiar din sesiunea IEx.
Simplu, chiar așa!
Ok, ce zici dacă vrei să recompilezi un modul? Ar trebui să părăsiți IEx, să îl rulați din nou și să compilați fișierul din nou? Nu! Dacă aveți o memorie bună, vă veți aminti că atunci când am enumerat toți ajutoarele disponibile în IEx REPL, am văzut ceva despre o comandă de recompilare. Să vedem cum funcționează.
Observați că de data aceasta, ați trecut ca argument modulul în sine și nu calea fișierului.
După cum am văzut, IEx are o grămadă de alți asistenți utili care vă vor ajuta să învățați și să înțelegeți mai bine cum funcționează un program Elixir.

Bazele tipurilor de elixir
Numerele
Există două tipuri de numere. Numerele întregi cu dimensiuni arbitrare și numere în virgulă mobilă.
numere întregi
Numerele întregi pot fi scrise în bază zecimală, hexazecimală, octală și binară.
Ca și în Ruby, puteți folosi liniuța de subliniere pentru a separa grupuri de trei cifre atunci când scrieți numere mari. De exemplu, ai putea corecta o sută de milioane astfel:
100_000_000
Octal:
0o444
hexzecimal:
0xabc
Binar:
0b1011
Plutitoare
Floare sunt IEEE 754 dublă precizie. Au 16 cifre de precizie și un exponent maxim de aproximativ 10308.
Flotantele sunt scrise folosind virgulă zecimală. Trebuie să existe cel puțin o cifră înainte și după punct. De asemenea, puteți adăuga un exponent final. De exemplu, 1.0, 0.3141589e1 și 314159.0-e.
Atomi
Atomii sunt constante care reprezintă nume. Sunt valori imuabile. Scrieți un atom cu două puncte :
și o secvență de litere, cifre, liniuțe de subliniere și la semnele @
. De asemenea, le puteți scrie cu două puncte :
și o secvență arbitrară de caractere cuprinse între ghilimele.
Atomii sunt un instrument foarte puternic, sunt folosiți pentru a face referire la funcții erlang, precum și la taste și metode Elixir.
Iată câțiva atomi validi.
:name, :first_name, :"last name", :===, :is_it_@_question?
booleene
Desigur, booleanele sunt valori adevărate și false. Dar lucrul drăguț la ei este, la sfârșitul zilei, că sunt doar atomi.
Siruri de caractere
În mod implicit, șirurile din Elixir sunt compatibile cu UTF-8. Pentru a le folosi, puteți avea un număr arbitrar de caractere încadrate de "
sau '
. Puteți avea, de asemenea, expresii interpolate în interiorul șirului, precum și caractere escape.
Rețineți că șirurile ghilimele simple sunt de fapt o listă de binare.
Funcții anonime
Ca limbaj funcțional, Elixir are funcții anonime ca tip de bază. O modalitate simplă de a scrie o funcție este fn (argument_list) -> body end
. Dar o funcție poate avea mai multe corpuri cu mai multe liste de argumente, clauze de gardă și așa mai departe.
Dave Thomas, în cartea Programming Elixir, sugerează să ne gândim la fn...end ca fiind ghilimele care înconjoară un șir literal, unde, în loc să returnăm o valoare șir, returnăm o funcție.
Tupluri
Tuple este o matrice indexată imuabilă. Aceștia își returnează rapid dimensiunea și încetinesc să adauge noi valori datorită naturii sale imuabile. Când actualizați un tuplu, de fapt creați o copie complet nouă a tuplu-ului.
Tuplurile sunt foarte des folosite ca valoare de returnare a unui tablou. În timp ce codificați în Elixir, veți vedea foarte des acest lucru, {:ok, something_else_here}
.
Iată cum scriem un tuplu: {?a,?b,?c}
.
Potrivire de model
Nu voi putea explica tot ce trebuie să știți despre potrivirea modelelor, totuși ceea ce sunteți pe cale să citiți acoperă o mulțime de ceea ce trebuie să știți pentru a începe.
Elixir folosește =
ca operator de potrivire. Pentru a înțelege acest lucru, trebuie să dezvățăm ceea ce știm despre =
în alte limbi tradiționale. În limbile tradiționale, operatorul egal este pentru atribuire. În Elixir, operatorii egali sunt pentru potrivirea modelelor.
Deci, așa funcționează valorile din partea stângă. Dacă sunt variabile, acestea sunt legate de partea dreaptă, dacă nu sunt variabile, elixirul încearcă să le potrivească cu partea dreaptă.
Operator PIN
Elixir oferă o modalitate de a forța întotdeauna potrivirea modelului împotriva variabilei din partea stângă, operatorul pin.
Liste
În Elixir, Listele arată ca matrice așa cum le cunoaștem din alte limbi, dar nu sunt. Listele sunt structuri legate care constau dintr-un cap și o coadă.
Liste de cuvinte cheie
Listele de cuvinte cheie sunt o listă de perechi de tuplu.
Pur și simplu le scrieți ca liste. De exemplu: [{:unu, 1}, 2, {:trei, 3}]. Există o comandă rapidă pentru definirea listelor, iată cum arată: [unu: 1, trei: 3].
Pentru a prelua un articol dintr-o listă de cuvinte cheie puteți utiliza fie:
Keyword.get([{:one, 1}, 2, {:three, 3}], :one)
Sau folosiți comanda rapidă:
[{:one, 1}, 2, {:three, 3}][:one]
Deoarece listele de cuvinte cheie sunt lente la preluarea unei valori, este o operațiune costisitoare, așa că dacă stocați date care necesită acces rapid, ar trebui să utilizați o hartă.
Hărți
Hărțile sunt o colecție eficientă de perechi cheie/valoare. Cheia poate avea orice valoare doriți ca cheie, dar de obicei ar trebui să fie de același tip. Spre deosebire de listele de cuvinte cheie, Maps permite o singură intrare pentru o anumită cheie. Sunt eficiente pe măsură ce cresc și pot fi utilizate în potrivirea modelului Elixir în hărțile de uz general atunci când aveți nevoie de o matrice asociativă.
Iată cum puteți scrie o hartă:
%{ :one => 1, :two => 2, 3 => 3, "four" => 4, [] => %{}, {} => [k: :v]}
Concluzie
Elixir este minunat, ușor de înțeles, are tipuri simple, dar puternice și instrumente foarte utile în jurul său, care vă vor ajuta când începeți să învățați. În această primă parte, am acoperit diferitele tipuri de date pe care sunt construite programele Elixir și operatorii care le alimentează. În părțile ulterioare ne vom scufunda mai adânc în lumea Elixir - programare funcțională și concomitentă.