Каковы новые возможности в последних версиях Elixir?
Elixir 1.17 принёс тип Duration, первые предупреждения системы типов и улучшенный dbg; 1.16 — миграционный форматтер и ExDoc из файла; 1.15 — переработанный Logger поверх Erlang :logger и ускорение компиляции через OTP 26.
Новые возможности в последних версиях Elixir
Ниже описаны ключевые нововведения Elixir 1.15–1.17 (актуальная стабильная ветка на начало 2026 года). Проект чётко следует semantic versioning и публикует подробные CHANGELOG на GitHub.
Elixir 1.17 (2024)
Типы для функций (набросок type system)
Команда начала интегрировать постепенную типизацию. В 1.17 появились предупреждения компилятора о несоответствии типов в ряде конструкций (pattern match на константах, возврат из функции). Это первый шаг к полноценной системе типов без Dialyzer.
# Компилятор теперь предупреждает, если ветка case заведомо недостижима
case value do
x when is_integer(x) and is_binary(x) -> :impossible # warning
_ -> :ok
end
Duration и Calendar.duration
Новый тип Duration для работы с интервалами времени. Функции Date.shift/2, DateTime.shift/2, Time.shift/2 принимают Duration вместо keyword-списков.
d = Duration.new!(year: 1, month: 2, day: 10)
Date.shift(~D[2024-01-15], d) # => ~D[2025-03-25]
# Сигил ~P для Duration
Duration.new!(~P[1Y2M10D]) # ISO 8601 синтаксис
Улучшенные предупреждения компилятора
1.17 добавил предупреждение :undefined_variable при обращении к переменной, которая ещё не определена внутри блока. Ранее Elixir молча создавал новую переменную в некоторых контекстах.
Elixir 1.16 (2024)
ExDoc нового поколения
Встроенный генератор документации получил поддержку @moduledoc {file: "README.md"} — модульная документация теперь может читаться из внешнего файла. Также добавлен mix docs --open для автоматического открытия браузера.
dbg/2 улучшения
Макрос dbg/2, появившийся в 1.14, в 1.16 научился отображать промежуточные шаги пайплайна |> прямо в IEx без дополнительной конфигурации.
"hello world"
|> String.upcase()
|> String.split()
|> dbg()
# [debug] "hello world" #=> "HELLO WORLD" #=> ["HELLO", "WORLD"]
mix format --migrate
Новый флаг автоматически мигрирует устаревший синтаксис (например, старый стиль guard-выражений) до актуального.
Elixir 1.15 (2023)
Компиляция через Erlang/OTP 26
Поддержка OTP 26 принесла значительное ускорение компиляции (~15-20%) благодаря новому механизму кеширования модулей в Erlang.
Logger переработан на :logger Erlang
Встроенный Logger теперь является тонкой обёрткой над :logger (Erlang OTP). Конфигурация через config :logger, level: :info теперь напрямую управляет Erlang-хендлерами. Это улучшает совместимость с Erlang-библиотеками.
# config/config.exs
config :logger, :default_handler,
level: :info,
formatter: {Logger.Formatter, [format: "$time $metadata[$level] $message\n"]}
Mix.install/2 с зависимостями
Mix.install/2 в скриптах теперь поддерживает опции :config и :system_env напрямую, что упрощает написание одиночных скриптов с конфигурацией.
Mix.install(
[{:req, "~> 0.5"}],
config: [req: [default_headers: [{"user-agent", "my-script"}]]]
)
Дорожная карта (Elixir 1.18+)
- Постепенная типизация с выводом типов без аннотаций (set-theoretic types)
- Интеграция Language Server Protocol в Mix (улучшенный ElixirLS)
- Native WASM-таргет через BEAMJIT (экспериментально)
Подводные камни
- Duration и часовые пояса —
DateTime.shift/2сDurationне учитывает переход на летнее время автоматически; используйтеCalendar.TimeZoneDatabaseявно. - Logger migration — после перехода на OTP :logger некоторые сторонние хендлеры (например, старые версии Logflare) ломаются; проверьте совместимость зависимостей.
- Предупреждения типов как шум — в 1.17 предупреждения типов могут быть многословными на легаси-коде; настройте
@dialyzer {:no_return, ...}или подавите черезMix.Task.Compiler.diagnostics. - OTP 26+ требования — Elixir 1.15+ требует минимум OTP 24, 1.17 — OTP 25. Docker-образы на старых базах (
erlang:23) не соберут новый проект. - mix format --migrate необратим — запускайте в ветке и проверяйте diff; некоторые автоматические замены ломают кастомные форматтеры.
- dbg/2 в production — оставленный в коде
dbg/2будет печатать в stdout; добавьте линтер-правило (например, через Credo) для детектирования в CI. - Duration в ISO 8601 — сигил
~Pразбирает только ISO 8601 Duration, без поддержки недель (P1W— ошибка); используйтеDuration.new!(week: 1).
Common mistakes
- Сводить latest elixir features к названию метода без lifecycle и failure path.
- Игнорировать модель runtime: Elixir компилируется в BEAM bytecode и наследует процессы, message passing, supervision и hot-code friendly модель Erlang VM.
- Не отделять validation, authorization, transaction boundary и business logic.
What the interviewer is testing
- Объясняет latest elixir features через конкретную точку lifecycle в Elixir.
- Приводит корректный минимальный пример без вымышленных методов или callbacks.
- Называет edge cases: пустые значения, ошибки, транзакции, безопасность или concurrency.