💧 Elixir

Функциональный язык на BEAM: типы, pipe, паттерн-матчинг, процессы.

Шпаргалки · Программирование · #elixir #beam #functional

IDE и запуск

VS Code + ElixirLS, IntelliJ. iex (интерактив), elixir file.exs, проекты mix new app, mix test, mix deps.get. Пакеты: Hex.

Типы данных

1; 3.14; true; nil; :atom; "строка"
[1, 2, 3]                  # связный список
{:ok, 1}                   # кортеж
%{a: 1, "b" => 2}          # map
[a: 1, b: 2]               # keyword list
~r/\d+/                    # regex

Операторы

+ - * /, div, rem, == !=, === !==, and or not (строго bool), && || !, <> (строки), ++ (списки), |> (pipe), = (сопоставление, не присваивание).

Циклы

Циклов нет: рекурсия, Enum и for.

for x <- 1..5, rem(x, 2) == 1, do: x * x
Enum.map([1, 2], &(&1 * 2))
Enum.reduce(1..3, 0, fn x, acc -> x + acc end)

Функции

defmodule Math do
  def add(a, b \\ 0), do: a + b
  def fact(0), do: 1
  def fact(n) when n > 0, do: n * fact(n - 1)
end
sq = fn x -> x * x end
[1, 2, 3] |> Enum.map(sq) |> Enum.sum()

Встроенные

IO.puts, inspect, length, hd, tl, is_integer, String.upcase, Enum.sort, Map.get, elem.

Асинхронность (процессы)

pid = spawn(fn -> receive do msg -> IO.inspect(msg) end end)
send(pid, :hello)
Task.async(fn -> 1 + 1 end) |> Task.await()

Надёжность: GenServer, Supervisor.

Коллекции

Enum, Map, List, Keyword, MapSet, ленивые Stream.

Библиотеки по задачам

Phoenix (веб, LiveView), Ecto (БД), Oban (фоновые задачи), Broadway (потоки данных), Nx (ML), ExUnit (тесты).