Исходный код Журнал изменений для 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'sformat_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'selseшаблонов - [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для отражения APIMap - [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.
© 2012-2024 The Elixir Team
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.17.2/changelog.html