Noțiuni introductive cu limbajul de programare Elixir

Publicat: 2022-03-11

Dacă 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.

O demonstrație IEx REPL.

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 .

Ieșirea din IEx REPL.

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:

Ajutoare IEx.

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ță:

IEx: Verificarea documentelor.

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:

Listare director pentru acest proiect Elixir.

Acum, pentru a rula testele pe modulul Anagram, trebuie să rulați/compilați testele.

Efectuarea testelor în Elixir.

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.

Compilarea direct dintr-o sesiune 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ă.

Recopilare în IEx.

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.

Booleenii sunt doar atomi, așa cum s-a dovedit prin IEx.

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.

Interpolarea corzilor de elixir.

Rețineți că șirurile ghilimele simple sunt de fapt o listă de binare.

Comportamentul șirului de ghilimele simple în Elixir.

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.

Returnarea unei funcții Elixir.

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

Demo de potrivire a modelului Elixir.

Operator PIN

Elixir oferă o modalitate de a forța întotdeauna potrivirea modelului împotriva variabilei din partea stângă, operatorul pin.

Elixir pin operator demonstrație.

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

Comportamentul listei de elixir.

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

Înrudit : Dezvăluirea ClojureScript pentru dezvoltarea front-end