Spec-Zone.ru › Elixir 1.17

Исходный код Журнал изменений для Elixir v1.17

Этот релиз включает вывод типов для шаблонов, чтобы выдавать предупреждения для начального набора конструкций (бинарные, карты и атомы) в рамках одной функции. Он также включает новый тип данных Duration для взаимодействия с типами Calendar, поддержку Erlang/OTP 27 и многие другие улучшения.

Предупреждения от постепенных типов множеств

Этот релиз вводит постепенные типы множеств для вывода типов из шаблонов и их использования для проверки типов программ, позволяя компилятору Elixir обнаруживать ошибки и баги в кодовых базах без необходимости изменений в существующем ПО. Основные принципы, теория и дорожная карта нашей работы описаны в "The Design Principles of the Elixir Type System" by Giuseppe Castagna, Guillaume Duboc, José Valim.

В данный момент разработчики Elixir будут взаимодействовать с типами множеств только через предупреждения, выдаваемые системой типов. Текущая реализация моделирует все типы данных в языке:

  • binary(), integer(), float(), pid(), port(), reference() - эти типы неделимы. Это означает, что как 1 так и 13 получают тот же тип integer().

  • atom() - он представляет все атомы и делится. Например, атом :foo и :hello_world также являются допустимыми (различными) типами.

  • map() и структуры - карты могут быть «закрытыми» или «открытыми». Закрытые карты допускают только указанные ключи, такие как %{key: atom(), value: integer()}. Открытые карты поддерживают любые другие ключи помимо указанных, и их определение начинается с ..., например, %{..., key: atom(), value: integer()}. Структуры являются закрытыми картами с ключом __struct__.

  • tuple(), list(), и function() - в настоящее время они моделируются как неделимые типы. Будущие версии Elixir также внедрят поддержку более мелкого уровня для них.

В этом первом релизе мы сосредоточились на атомах и картах, поскольку они соответственно являются самыми простыми и самыми сложными типами представления, что позволит нам оценить производительность системы типов и качество сообщений об ошибках. Моделирование этих типов также принесет наибольшую пользу разработчикам Elixir. Предполагая, что существует переменная с именем user, содержащая структуру %User{} со свойством address, Elixir v1.17 будет выдавать следующие предупреждения во время компиляции:

  • Сопоставление с шаблоном карты или структуры, в которой отсутствует заданный ключ, например %{adress: ...} = user (обратите внимание на address против adress)

  • Обращение к ключу в карте или структуре, в которой отсутствует заданный ключ, например user.adress

  • Вызов функции над немодулями, например user.address()

  • Поим функции над немодулями, например &user.address/0

  • Попытка вызвать анонимную функцию без фактической функции, например user.()

  • Выполнение структурных сравнений со структурами, например my_date < ~D[2010-04-17]

  • Выполнение структурных сравнений между непересекающимися типами, например integer >= string

  • Создание и сопоставление шаблонов с бинарными данными без соответствующих спецификаторов, например <<name>> (это предупреждение, так как по умолчанию ожидается целое число, должно было быть <<name::binary>> вместо этого)

  • Попытка перехватить неопределённое исключение или структуру, которая не является исключением

  • Обращение к полю, которое не определено в перехваченном исключении

Эти новые предупреждения помогают разработчикам Elixir находить ошибки на более ранних стадиях и повышают уверенность при рефакторинге кода, особенно в работе с картами и структурами. Хотя некоторые из этих предупреждений были выданы и в прошлом, они были обнаружены с помощью синтаксического анализа. Новые предупреждения более надёжны, точны и содержат лучшие сообщения об ошибках. Однако следует учитывать, что в настоящее время система проверки типов Elixir выводит типы только из шаблонов в рамках одной функции. Анализ из охранных условий и между границами функций будет добавлен в будущих релизах. Более подробная информация доступна в новом документе справки о постепенных типах множеств.

Система типов была создана благодаря сотрудничеству CNRS и Remote. Разработка в настоящее время спонсируется Fresha, Starfish* и Dashbit.

Поддержка Erlang/OTP

Этот релиз добавляет поддержку Erlang/OTP 27 и отключает поддержку Erlang/OTP 24. Мы рекомендуем разработчикам Elixir мигрировать на Erlang/OTP 26 или более поздние версии, особенно на Windows. Поддержка WERL (графического пользовательского интерфейса для терминала Erlang на Windows) будет удалена в Elixir v1.18.

Добавление функций Duration и shift/2

Elixir вводит тип данных Duration и API для сдвига дат, времён и дат-времён на заданную длительность, учитывая различные календари и часовые пояса.

iex> Date.shift(~D[2016-01-31], month: 2)
~D[2016-03-31]

Обратите внимание, что операция называется shift (вместо add), так как работа с продолжительностью не подчиняется свойствам, таким как ассоциативность. Например, добавление одного месяца, а затем ещё одного месяца, не даст того же результата, что и добавление двух месяцев:

iex> ~D[2016-01-31] |> Date.shift(month: 1) |> Date.shift(month: 1)
~D[2016-03-29]

Тем не менее, продолжительности необходимы для построения интервалов, повторяющихся событий и моделирования сложностей планирования, встречающихся в окружающем нас мире. Для DateTime, Elixir будет правильно обрабатывать изменения часовых поясов (например, летнее время), но также доступны средства для обработки конфликтов (например, вы сдвинули часы, которых не существует, потому что часы были передвинуты вперёд на один час). См. DateTime.shift/2 для примеров.

Наконец, добавлена новая функция Kernel.to_timeout/1, которая помогает разработчикам нормализовать продолжительности и целые числа в таймаут, используемый API процессов. Например, чтобы отправить сообщение через час, теперь можно написать:

Process.send_after(pid, :wake_up, to_timeout(hour: 1))

v1.17.2 (2024-07-06)

1. Исправления ошибок

Logger

  • [Logger.Translator] Исправление сбоя логгера, когда :gen_statem's format_status/2 возвращает не кортеж

Mix

  • [mix deps.get] Исправление регрессии при получении Git-репозитория с :ref
  • [mix release] Проверка RELEASE_MODE и установка ERRORLEVEL для .bat скриптов
  • [mix release] Исправление некорректного примера в комментарии к коду в сгенерированном vm.args.eex

v1.17.1 (2024-06-18)

1. Улучшения

Mix

  • [mix compile.elixir] Не выполнять вычисление неподвижной точки на зависимостях во время выполнения. Это должно значительно ускорить время компиляции крупных проектов при изменении только одного или двух файлов

2. Исправления ошибок

EEx

  • [EEx] Не выдавать предупреждение для присваивания с блоками в EEx

Elixir

  • [Kernel] Исправление ошибки при использовании закреплённых переменных внутри with's else шаблонов
  • [Kernel] Исправление ошибки Dialyzer, когда блок else вызывает функцию no_return

ExUnit

  • [ExUnit] Не использовать альтернативные синхронные/асинхронные наборы тестов для --repeat-until-failure

v1.17.0 (2024-06-12)

1. Улучшения

Elixir

  • [Access] Добавить Access.find/1, аналогичный Enum.find/2
  • [Code] Поддержка курсора внутри fn/rescue/catch/else/after внутри Code.Fragment.container_cursor_to_quoted/2
  • [Date] Добавить Date.shift/2 для сдвига дат с продолжительностью и семантикой, зависящей от календаря
  • [Date] Разрешить Date принимать годы вне диапазона -9999..9999
  • [DateTime] Добавить DateTime.shift/2 для сдвига дат-времён с продолжительностью и семантикой, зависящей от календаря
  • [Duration] Добавить новый тип данных Duration
  • [GenServer] Добавить вызов обратного метода GenServer.format_status/1
  • [Kernel] Добавить Kernel.get_in/1 с безопасной обработкой nil для доступа к структурам
  • [Kernel] Добавить охранное условие Kernel.is_non_struct_map/1
  • [Kernel] Добавить Kernel.to_timeout/1
  • [Kernel] Выдавать предупреждения об неопределённых функциях модулей, определённых в том же контексте, что и вызывающий код
  • [Kernel] Поддержка целых чисел в заглавных регистре в сигилах
  • [Keyword] Добавить Keyword.intersect/2-3 для отражения API Map
  • [Macro] Добавить Macro.Env.define_alias/4, Macro.Env.define_import/4, Macro.Env.define_require/4, Macro.Env.expand_alias/4, Macro.Env.expand_import/5, и Macro.Env.expand_require/6 для поддержки языковых серверов и встраиваемых языков
  • [NaiveDateTime] Добавить NaiveDateTime.shift/2 для сдвига «наивных» дат-времён с продолжительностью и семантикой, зависящей от календаря
  • [Process] Добавить Process.set_label/1
  • [String] Добавить String.byte_slice/3 для нарезки строки до максимального количества байт, сохраняя UTF-8 кодировку
  • [System] Поддержка use_stdio: false в System.cmd/3 и System.shell/2
  • [Time] Добавить Time.shift/2 для сдвига времён с продолжительностью и семантикой, зависящей от календаря

ExUnit

  • [ExUnit] Передать сам процесс теста как вызывающую сторону в start_supervised
  • [ExUnit] Включить максимальное количество случаев в отчётах ExUnit

IEx

  • [IEx.Helpers] Предупреждает, если recompile был вызван, и текущая рабочая директория изменилась
  • [IEx.Helpers] Добавляет c/0 в качестве псевдонима к continue/0
  • [IEx.Pry] Добавляет IEx.Pry.annotate_quoted/3 для аннотирования выражения в кавычках с точками останова pry

Журналирование

  • [Logger] Форматирует :gen_statem отчеты, используя структуры данных Elixir
  • [Logger] Включает метку процесса в события журналирования

Mix

  • [mix deps] Добавляет опцию :depth к Mix.SCM.Git, тем самым поддерживая поверхностные клоны Git зависимостей
  • [mix deps] Предупреждает, если :optional используется в сочетании с :in_umbrella
  • [mix deps.get] Не добавляет требования к необязательным зависимостям, если зависимость-родитель была пропущена
  • [mix deps.tree] Добавляет --umbrella-only к mix deps.tree
  • [mix profile.tprof] Добавляет новый профайлер, доступный в Erlang/OTP 27+, который может измерять количество, время и использование кучи
  • [mix test] Добавляет mix test --breakpoints для настройки точки останова перед каждым запуском теста
  • [mix test] Добавляет mix test --repeat-until-failure для повторного запуска тестов до тех пор, пока не произойдёт ошибка
  • [mix test] Добавляет mix test --slowest-modules для вывода модулей с наибольшим временем выполнения на основе всех тестов, которые они содержат
  • [mix test] Параллельно генерирует HTML файлы отчётов покрытия

2. Исправления ошибок

Elixir

  • [bin/elixir.bat] Улучшено обращение с кавычками и восклицательными знаками во флагах
  • [Code] Исправлена ошибка, когда узлы AST для (a -> b) не были обернуты как часть кодировщика литералов
  • [Kernel] Устранены несоответствия в обработке .. и ... на уровне AST
  • [Kernel] Исправлен приоритет парсинга неоднозначных операторов, за которыми следуют контейнеры
  • [Kernel] Не расширять код в quote bind_quoted: ... дважды
  • [Kernel] Учитывать свойство :line при предоставлении :file в качестве опции к quote
  • [Kernel] Не аварийно завершать работу при Macro.escape/2 при передаче тройного кавычки без допустимого мета
  • [Kernel] Избегать двойного отслеживания событий при захвате функции
  • [Kernel] Исправлена ошибка, когда захваченные аргументы вступали в конфликт, если захват включал макрос, который также использовал захваты
  • [Module] Возвращать значение по умолчанию в Module.get_attribute/3 для сохранённых атрибутов, которые ещё не были записаны
  • [String] Правильно обрабатывать перестановки в jaro_distance. Это исправит результат расстояния в некоторых случаях

IEx

  • [IEx.Helpers] Обновление размера истории при обрезке истории

Mix

  • [mix deps] Исправление сообщения об ошибке для расхождения определения SCM в соседних элементах

3. Мягкие устаревания (не генерируются предупреждения)

Elixir

  • [GenServer] Устаревание обратного вызова GenServer.format_status/2 для соответствия Erlang/OTP 25+

Mix

  • [mix profile.cprof] Устарело в пользу нового mix profile.tprof
  • [mix profile.eprof] Устарело в пользу нового mix profile.tprof

4. Жёсткие устаревания

Elixir

  • [IO] Передача :all в IO.read/2 и IO.binread/2 устарело, используйте :eof вместо этого
  • [Kernel] Устарели списки символов в одинарных кавычках, используйте ~c вместо этого
  • [Kernel] Устарело экранирование закрывающего разделителя в верхнем регистре
  • [Range] left..right без явных шагов внутри шаблонов и охранных выражений устарело, используйте left..right//step вместо этого
  • [Range] Устарели уменьшающиеся диапазоны, такие как 10..1 без явного шага, используйте 10..1//-1 вместо этого

ExUnit

  • [ExUnit.Case] register_test/4 устарело в пользу register_test/6 по причинам производительности

v1.16

Список изменений для выпусков v1.16 можно найти в ветке v1.16.

← Предыдущая страница Справочник по API
Следующая страница → Введение

Скачать версию ePub

Создано с помощью ExDoc (v0.34.1) для языка программирования Elixir

© 2012-2024 The Elixir Team
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.17.2/changelog.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API