v1.18.0
Official announcement: https://elixir-lang.org/blog/2024/12/19/elixir-v1-18-0-released/
1. Enhancements
Elixir
- [CLI] Add experimental PowerShell scripts for 
elixir,elixirc, andmixon Windows. Those provide a safer entry point for running Elixir from other platforms - [Calendar] Add 
Duration.to_string/1 - [Code] Support several migration options in 
Code.format_string!/2 - [Code] Add parenthesis around 
--and---inCode.format_string!/2to make precedence clearer - [Code] Include more metadata in 
Code.string_to_quoted/2whentoken_metadata: trueto help compute ranges from the AST - [Code.Fragment] Have 
:capture_argas its own entry inCode.Fragment.surround_context/2 - [Config] Add 
Config.read_config/1 - [Enumerable] Add 
Enum.product_by/2andEnum.sum_by/2 - [Exception] Add 
MissingApplicationsErrorexception to denote missing applications - [JSON] Add a new 
JSONmodule with encoding and decoding functionality - [JSON] Implement 
JSON.Encoderfor all Calendar types - [Kernel] Update source code parsing to match UTS #55 latest recommendations. In particular, mixed script is allowed in identifiers as long as they are separate by underscores (
_), such ashttp_сервер. Previously allowed highly restrictive identifiers, which mixed Latin and other scripts, such as the japanese word for t-shirt,Tシャツ, now require the underscore as well - [Kernel] Warn on bidirectional confusability in identifiers
 - [Kernel] Verify the type of the binary generators
 - [Kernel] Track the type of tuples in patterns and inside 
elem/2 - [Kernel] Perform validation of root AST nodes in 
unquoteandunquote_splicingto catch bugs earlier - [Kernel] Add source, behaviour, and record information to Docs chunk metadata
 - [Kernel] Support deterministic builds in tandem with Erlang by setting 
ERL_COMPILER_OPTIONS=deterministic. Keep in mind deterministic builds strip source and other compile time information, which may be relevant for programs - [Kernel] Allow aliases and imports to be enabled conditionally in module body
 - [List] Add 
List.ends_with?/2 - [Macro] Improve 
dbghandling ofif/2,with/1and of code blocks - [Macro] Add 
Macro.struct_info!/2to return struct information mirroringmod.__info__(:struct) - [Registry] Add 
Registry.lock/3for local locking - [PartitionSupervisor] Add 
PartitionSupervisor.resize!/2to resize the number of partitions in a supervisor (up to the limit it was started with) - [Process] Handle arbitrarily high integer values in 
Process.sleep/1 - [Protocol] Add 
@undefined_impl_descriptionto customize error message when an implementation is undefined - [Protocol] Add 
__deriving__/1as optional macro callback toProtocol, no longer requiring empty implementations - [String] Inspect special whitespace and zero-width characters using their Unicode representation
 - [String] Update Unicode to 16.0
 
ExUnit
- [ExUnit] Support parameterized tests on 
ExUnit.Case - [ExUnit] Support test groups: tests in the same group never run concurrently
 - [ExUnit.Case] Add 
test_pidas a tag 
IEx
- [IEx] Add 
IEx.configure(auto_reload: true)to automatically pick up modules recompiled from other operating system processes - [IEx] Add 
:dot_iexsupport toIEx.configure/1 - [IEx] Add report for normal/shutdown exits in IEx
 
Mix
- [mix compile] Ensure only a single operating system process can compile at a given time
 - [mix deps.get] Ensure only a single operating system process can fetch deps at a given time
 - [mix format] Add 
mix format --migrateto migrate from deprecated functionality - [mix format] Add new options and metadata to improve formatting applying by editors and other environments
 - [mix test] Taint failure manifest if requiring or compiling tests fail
 - [Mix.Project] Add a 
:listenersconfiguration to listen to compilation events from the current and other operating system processes - [Mix.Task.Compiler] Add API for fetching all persisted compiler diagnostics
 - [Mix.Task.Compiler] Add API for fetching all compiler tasks
 
2. Bug fixes
Elixir
- [Code] Fix delimiter metadata for single quoted atoms and remote calls in 
Code.string_to_quoted/2 - [Code.Formatter] Fix formatter adding extra escapes to quoted remote calls
 - [Code.Fragment] Properly handle keyword keys as their own entry
 - [Inspect.Algebra] Ensure 
next_break_fitsrespectsline_length - [Kernel] Validate AST on 
unquoteandunquote_splicingto provide better error reports instead of failing too late inside the compiler - [Kernel] Avoid crashes when emitting diagnostics on code using \t for indentation
 - [Module] Include module attribute line and name when tracing its aliases
 - [Stream] Do not halt streams twice in 
Stream.transform/5 - [URI] Fix a bug when a schemaless URI is given to 
URI.merge/2 
ExUnit
- [ExUnit.Assertions] Raise if guards are used in 
assert/1with= - [ExUnit.Assertions] Format inserted/deleted maps in list assertions
 
IEx
- [IEx.Helpers] 
IEx.Helpers.recompile/0will reload modules changed by other operating system processes 
Mix
- [mix compile] Ensure warnings from external resources are emitted with 
--all-warningswhen files do not change - [mix deps.compile] Fix escaping issues when invoking 
rebar3in some cases - [mix escript] Fix escript layout and support storing 
privdirectories - [mix release] Make 
.appfiles deterministic in releases - [Mix.Shell] Fix 
Mix.Shellon Windows when outputting non UTF-8 characters 
3. Soft deprecations (no warnings emitted)
Elixir
- [Inspect.Algebra] 
color/3is deprecated in favor ofcolor_doc/3 - [Inspect.Algebra] 
fold_doc/2is deprecated in favor offold/2 - [Kernel] Deprecate 
unlessin favor ofif. Usemix format --migrateto automate the migration - [Macro] 
Macro.struct!/2is deprecated in favor ofMacro.struct_info!/2 - [Protocol] Defining 
__deriving__/3inside theAnyimplementation is deprecated, derive it inside the protocol definition itself 
4. Hard deprecations
EEx
- [EEx] 
<%#is deprecated in favor of<%!--or<% # - [EEx] 
c:EEx.handle_text/2is deprecated in favor ofc:EEx.handle_text/3 
Elixir
- [Code] Setting 
:warnings_as_errorsis deprecated viaCode.put_compiler_option/2. This must not affect developers, as the:warnings_as_errorsoption is managed by Mix tasks, and not directly used via theCodemodule - [Enumerable] Deprecate returning a two-arity function in 
Enumerable.slice/1 - [List] 
List.zip/1is deprecated in favor ofEnum.zip/1 - [Module] Deprecate 
Module.eval_quoted/3in favor ofCode.eval_quoted/3 - [Range] Deprecate inferring negative ranges on 
Range.new/2 - [Tuple] 
Tuple.append/2is deprecated, useTuple.insert_at/3instead 
Mix
- [mix cmd] Deprecate 
mix cmd --app APPin favor ofmix do --app APP - [mix compile] 
:warnings_as_errorsconfiguration in:elixirc_optionsis deprecated. Instead pass the--warnings-as-errorsflag tomix compile. Alternatively, you might alias the task:aliases: [compile: "compile --warnings-as-errors"] - [mix test] 
:warnings_as_errorsconfiguration in:test_elixirc_optionsis deprecated. Instead pass the--warnings-as-errorsflag tomix test. Alternatively, you might alias the task:aliases: [test: "test --warnings-as-errors"] - [Mix.Tasks.Compile] Deprecate 
compilers/0in favor ofMix.Task.Compiler.compilers/0 
v1.17
The CHANGELOG for v1.17 releases can be found in the v1.17 branch.