Elixir (gjuhë programimi)

**Elixir** është një gjuhë programimi funksionale, konkurrente, e nivelit të lartë dhe me qëllim të përgjithshëm, që funksionon në makinën virtuale BEAM, e cila përdoret gjithashtu për të zbatuar gjuhën e programimit Erlang. Elixir ndërtohet mbi Erlang dhe ndan të njëjtat abstraksione për ndërtimin e aplikacioneve të shpërndara, tolerante ndaj gabimeve. Elixir gjithashtu ofron mjete dhe një dizajn të zgjerueshëm. Ky i fundit mbështetet nga metaprogramimi në kohë kompajlimi me makro dhe polimorfizëm nëpërmjet protokolleve.

Komuniteti organizon ngjarje vjetore në Shtetet e Bashkuara, Evropë, dhe Japoni, si dhe ngjarje dhe konferenca të vogla lokale.

## Historia 
José Valim krijoi gjuhën e programimit Elixir si një projekt kërkimi dhe zhvillimi në Plataformatec. Synimet e tij ishin të mundësonte zgjerim dhe produktivitet më të lartë në Erlang VM, duke ruajtur përputhshmërinë me ekosistemin e Erlang-ut.

Elixir është i destinuar për faqe dhe aplikacione në shkallë të gjerë. Ai përdor veçoritë e Ruby, Erlang dhe Clojure për të zhvilluar një gjuhë me njëkohësi të lartë dhe vonesë të ulët. Është projektuar për të trajtuar vëllime të mëdha të dhënash. Elixir përdoret gjithashtu në telekomunikacion, tregti elektronike dhe financë.

Në vitin 2021 u njoftua përpjekja Numerical Elixir me qëllimin për të sjellë në ekosistemin Elixir mësimin automatik, rrjetet nervore, përpilimin e GPU-ve, përpunimin e të dhënave dhe fletoret kompjuterike.

## Versionet 
Secili prej versioneve dytësore mbështet një gamë specifike të versioneve Erlang/OTP. Versioni aktual i qëndrueshëm është .

## Karakteristikat 
* Kompilohet në kod bajtesh për makinën virtuale BEAM të Erlang. Ndërveprim i plotë me kodin Erlang, pa ndikim në kohën e ekzekutimit.
* Shkallueshmëria dhe toleranca ndaj defekteve, falë mekanizmave të lehtë të njëkohshmërisë së Erlang-ut.
* Këshilla për shkrimin e mjeteve të analizës statike.
* Të dhëna të pandryshueshme, me theks, si në gjuhët e tjera funksionale, në rekursion dhe funksione të rendit më të lartë në vend të cikleve me efekte anësore.
* Programim i njëkohshëm pa asgjë të përbashkët nëpërmjet kalimit të mesazheve (modeli i aktorit).
* Koleksione të ngadalta dhe asinkrone me transmetime.
* Programimi i orientuar drejt “hekurudhave” nëpërmjet konstruktit `with`.
* Metaprogramim higjienik me anë të aksesit të drejtpërdrejtë në pemën abstrakte të sintaksës (AST). Bibliotekat shpesh zbatojnë gjuhë të vogla specifike për domenin, si për bazat e të dhënave ose testimin.
* Ekzekutim i kodit në kohën e kompilimit. Kompiluesi Elixir funksionon në BEAM, kështu që modulet që po kompilohen mund të ekzekutojnë menjëherë kodin që është kompiluar tashmë.
* Polimorfizëm nëpërmjet një mekanizmi të quajtur protokolle. Shpërndarje dinamike, si në Clojure, por pa dërgim të shumëfishtë, sepse protokollet Elixir dërgohen në një lloj të vetëm.
* Mbështetje për dokumentim nëpërmjet docstrings të ngjashme me Python në gjuhën e formatimit Markdown.
* Mbështetje për Unicode dhe vargje UTF-8.

## Shembuj 
Shembujt e mëposhtëm mund të ekzekutohen në një shell `iex` ose të ruhen në një skedar dhe të ekzekutohen nga rreshti i komandës duke shtypur elixir **.

Shembull klasik i “Hello World”:

```iex
iex> IO.puts("Hello World!")
Hello World!
```

Operatori i tubave:

```iex
iex> "Elixir" |> String.graphemes() |> Enum.frequencies()
%{"E" => 1, "i" => 2, "l" => 1, "r" => 1, "x" => 1}

iex> %{values: 1..5} |> Map.get(:values) |> Enum.map(& &1 * 2)
[2, 4, 6, 8, 10]

iex> %{values: 1..5} |> Map.get(:values) |> Enum.map(& &1 * 2) |> Enum.sum()
30
```

Përputhja e modelit (e njohur edhe si destruksion):

```iex
iex> %{left: x} = %{left: 5, right: 8}
iex> x
5

iex> {:ok, [_ | rest]} = {:ok, [1, 2, 3]}
iex> rest
[2, 3]
```

Përputhja e modelit me klauzola të shumëfishta:

```iex
iex> case File.read("path/to/file") do
iex>   {:ok, contents} -> IO.puts("found file: #{contents}")
iex>   {:error, reason} -> IO.puts("missing file: #{reason}")
iex> end
```

Kuptimi i listës:

```elixir
iex> for n  Task.async_stream(&File.read!("#{&1}.txt"))
|> Stream.filter(fn {:ok, contents} -> String.trim(contents) != "" end)
|> Enum.join("\n")
```

Trupa me funksione të shumëfishta me mbrojtëse:

```elixir
def fib(n) when n in [0, 1], do: n
def fib(n), do: fib(n-2) + fib(n-1)
```

Bazat e të dhënave relacionale me bibliotekën Ecto:

```elixir
schema "weather" do
  field :city     # Defaults to type :string
  field :temp_lo, :integer
  field :temp_hi, :integer
  field :prcp,    :float, default: 0.0
end

Weather |> where(city: "Kraków") |> order_by(:temp_lo) |> limit(10) |> Repo.all
```

Duke krijuar në mënyrë sekuenciale një mijë procese:

```elixir
for num  IO.puts("#{num * 2}") end
```

Kryerja asinkrone e një detyre:

```elixir
task = Task.async fn -> perform_complex_action() end
other_time_consuming_action()
Task.await task
```

## Shih edhe 
* Informatika e njëkohshme
* Informatika e shpërndarë
* Llogaritja paralele

## Referime 
## Lexime të mëtejshme 
* 
*