Eliksir (programski jezik)
Eliksir (, izgovor : Eliksir) je funkcionalan jezik. Njegovim tvorcem smatra se -{Jose Valim}-, koji je ovaj jezik dizajnirao 2011. godine. Ovaj jezik je nedavno postao izuzetno interesantan, naročito -{Rubi}- i -{Erlang}- programerima. -{Joe Armstrong}-, jedan od pronalazača -{Erlanga}-, podržao je i pohvalio ovaj novonastali jezik.
Pri kreiranja programskog jezika Eliksir veliki uticaj u smislu sintakse imao je jezik Rubi. U Eliksiru ne postoje objekti i klase, već se sve zasniva na funkcijama i rekurziji. Takođe, Eliksir preuzima mnoge koncepte iz programskih jezika kao što su -{Clojure}-, -{Haskell}-, i -{Python}-. Ovaj programski jezik dizajniran je za izgradnju skalabilnih i lako održivih aplikacija, jednostavne je i moderne sintakse. Mnogo zanimljivih projekata u vezi sa robotikom je rađeno u Elixiru zbog njegove funkcionalne prirode, izuzetnog rada u distrubiranim sistemima i tolerancije na greške, koja je na jako visokom nivou.
Takođe se uspešno koristi u razvoju veba i u domenu ugradnog softvera. Jezik Eliksir radi uz podršku Erlang virtualne mašine koja je karakteristična po minimalnom kašnjenju i zavidnoj toleranciji na greške.

Kompatibilnost sa Erlang-om 
Eliksir radi na Erlangovoj virtualnoj mašini. Erlang je jezik koji se koristi na Eriksonovim telekomunikaconim sistemima i jako je skalabilan i siguran.
Jezik Erlang i Eliksir dele iste bajt kodove, što omogućava Eliksiru da pozove bilo koju Erlang funkciju.
iex> :erlang.localtime
{{2013, 10, 22}, {0, 14, 29}}
Poziv erlang.localtime je poziv Erlang funkcije. U Erlangu, funkcija će biti pokrenuta  erlang: localtime ().
Eliksir programer može takođe da koristi bilo koju Erlangovu biblioteku.

-{IEX}- 

Eliksir interaktivna konzola -{iex}- () je glavni modul za interakciju sa programskim jezikom Eliksir.
Ono što je komanda -{irb}- u programskom jeziku Rubi to je -{iex}- u Eliksiru. 
-{Iex}- podržava komandu -{h()}- koja pruža pomoć programeru i daje pristup dokumentaciji. Da bismo pristupili -{Enum}- modulu ukucaćemo -{h(Enum)}- i dobiti potrebne informacije, a ukoliko želimo da pristupimo funkciji -{Enum}- modula potrebno je ukucati -{h(Enum.nazivfunkcije)}-.

Karakteristike jezika

Skalabilnost 
Eliksir kod izvršava se u nitima koje su izolovane i međusobno razmenjuju informacije putem poruka.

current_process = self() 
 spawn_link(fn -> send current_process, {:msg, "zdravo svete"}
end)
receive do
  {:msg, contents} -> IO.puts contents
end

Nije neuobičajno da se stotine hiljada procesa obrađuju paralelno u istoj mašini. Dobra izolacija procesa omogućava da ih sakupljač otpadaka lako ukloni, što utiče na efikasnost izvršavanja i omogućava korišćenje svih resursa (vertikalno skaliranje).

Procesi su takođe u stanju da komuniciraju sa drugim procesima koji rade na različitim mašinama u istoj mreži. Ovo omogućava programeru da sprovodi rad na više čvorova istovremeno (horizontalno skaliranje).

Tipovi u programskom jeziku Eliksir 

Osnovni tipovi u programskom jeziku Eliksir su :
 celobrojni tip
 realni tip
 logički tip
 atomi
 niske
 liste
 torke

iex> 1 # celobrojni tip
iex> 0x1F # celobrojni tip
iex> 1.0 # realni tip
iex> true # logički tip
iex> :atom # atom 
iex> "elixir" # niska
iex> [1, 2, 3] # lista
iex> {1, 2, 3} # torka

Posmatrajmo sledeći kod : 
iex> 1 + 2
3
iex> 5 * 5
25
iex> 10 / 2
5.0
Primetimo da 10/2 vraća realan broj 5,0 umesto celog broja 5. Ovo je očekivano jer u Eliksiru operator / uvek vraća -{float}- (realan broj). Ako želimo da dobijemo ceo broj ili ostatak pri deljenju, možemo pozvati funkcije -{div}- ili -{rem}-:
s
iex> div(10, 2)
5
iex> div 10, 2
5
iex> rem 10, 3
1
Primetimo da zagrade nisu potrebne da bi se pozvala funkcija.

Realan tip 
Realan (-{float}-) tip zahteva tačku iza koje se navodi najmanje jedna cifra, a takođe podržava i slovo -{e}- kao eksponent pomoću kojeg se predstavlja realan broj:
iex> 1.0
1.0
iex> 1.0e-10
1.0e-10

Realni tip u Eliksiru zauzima 64-bita i dvostruke je tačnosti.
Funkcija -{round()}- se koristi da bi se dobio najbliži ceo broj u datom -{floatu}-, a funkcija -{trunc()}- da se dobije celobrojni deo -{float}- podatka.
iex> round(3.58)
4
iex> trunc(3.58)
3

Logički tipovi 
Logički tip podataka u Eliksiru moze imati vrednost tačno (-{True}-) ili netačno (-{False}-)
iex> true
true
iex> true == false
false

Atomi 
Atomi su konstante čije je ime ujedno i njihova vrednost :
iex> :pas
:pas
iex> :pas == :mačka
false
U logičkom tipu podataka ključne reči -{true}- i -{false}- su u stvari atomi :
iex> true == :true
true
iex> is_atom(false)
true
iex> is_boolean(:false)
true

Niske(Stringovi) 
Stringovi u Eliksiru se pišu između dvostrukih navodnika.
iex> "papagaj"
"papagaj"
Stringovi se mogu štampati pomoću funkcije -{IO.puts}- iz -{IO}- modula.
iex> IO.puts "pepa\nprase"
pepa
prase
:ok
Dužinu niske određujemo pomoću funkcije -{String.length()}-.
iex> String.length("zdravo")
5

Povezane liste 
Liste se u programskom jeziku Eliksir predstavljaju uz pomoć zagrada [ ]. Članovi liste mogu biti bilo kog tipa.
iex> [1, 2, true, 3]
[1, 2, true, 3]

Dve liste mogu da se sabiraju i oduzimaju korišćenjem ++ i -- operatora:
iex> [1, 2, 3] ++ [4, 5, 6]
[1, 2, 3, 4, 5, 6]
iex> [1, true, 2, false, 3, true] -- [true, false]
[1, 2, 3, true]

Torke 
Torke se definišu uz pomoć vitičastih zagrada { }.
iex> {:ok, "Marina"}
{:ok, "Marina"}
iex> tuple_size {:ok, "Marina"}
2

Osnovni operatori 

U prethodnom delu, videli smo da Eliksir podržava aritmetičke operatore +, -, *, /, kao i funkcije -{div}- i -{rem}- koje služe za količnik i ostatak pri deljenju kod celobrojnih tipova.

Stringovi se nadovezuju uz pomoć operatora <>:
iex> "papa" <> "gaj"
"papagaj"
Eliksir takođe obezbeđuje tri logička operatora : -{or}-, -{and}- i -{not}-.
Ovi operatori očekuju logičku vrednost (-{true}- ili -{false}-) kao njihov prvi argument.
iex> true and true
true
iex> false or is_atom(:primer)
true
Zadavanje vrednosti koje nisu logičkog tipa će izbaciti izuzetak.
iex> 1 and true
** (ArgumentError) argument error: 1

Pored ovih logičkih operatora, Eliksir koristi i ||, && i ! koji se mogu primeniti na bilo koje tipove. 
Za ove operatore, sve vrednosti osim -{false}- i -{nil}- će biti -{true}- :

# or
iex> 1 || true
1
iex> false || 11
11

# and
iex> nil && 13
nil
iex> true && 17
17

# !
iex> !true
false
iex> !1
false
iex> !nil
true

Eliksir takođe koristi operatore poređenja ==, !=, ===, !==, <=, >=, <, i > koji vraćaju rezultat logičkog tipa (-{true}- i -{false}-).

iex> 1 == 1
true
iex> 1 != 2
true
iex> 1 < 2
true

Razlika između == i === je u tome što je drugi strožiji pri poređenju celog i realnog tipa.

iex> 1 == 1.0
true
iex> 1 === 1.0
false

U Eliksiru možemo da poredimo dva različita tipa podataka:

iex> 1 < :atom
true

Operator jednakosti 
U ovom poglavlju ćemo pokazati da je = operator jednakosti u Eliksiru i kako ga koristimo u strukturi podataka.

iex> x = 1
1
iex> x
1
iex> 1 = x
1
iex> 2 = x
** (MatchError) no match of right hand side value: 1

Primetimo da je 1 = -{x}- validan izraz, a to važi jer su leva i desna strana jednake 1. Promenljiva se može dodeliti samo sa leve strane, a kada se promenljiva nađe sa desne strane, operator = proverava jednakost. Kada jednakost nije ispunjena ispisaće se 'MatchError' .

iex> 1 = unknown
** (CompileError) iex:1: undefined function unknown/0

Pošto promenljiva unknown nije prethodno definisana,
Eliksir će pokušati da pozove funkciju pod nazivom -{unknown}- , ali takva funkcija ne postoji.

Operator jednakosti se ne koristi samo za proveru jednakosti nad jednostavnim promenljivim, nego je koristan i za razlaganje složenijih struktura podataka. Na primer, možemo ga upotrebiti i nad torkama.
 
iex> {a, b, c} = {:student, "Paja", 42}
{:hello, "world", 42}
iex> a
:student
iex> b
"Paja"

Operator jednakosti će izbaciti grešku ako strane nisu uporedive, na primer, ako su torke različite veličine:

iex> {a, b, c} = {:hello, "world"}
** (MatchError) no match of right hand side value: {:hello, "world"}

I takođe ako poredimo različite tipove podataka:

iex> {a, b, c} = [:hello, "world", 42]
** (MatchError) no match of right hand side value: [:hello, "world", 42]

Reference 

Programski jezici
Софтвер са Апач лиценцом