Erlang/OTP 29.0
OTP 29.0 #
Erlang/OTP 29 is a new major release with new features, improvements as well as a few incompatibilities. Some of the new features are highlighted below.
Many thanks to all contributors!
Highlights #
-
Added support for
-unsafeattributes for marking functions as unsafe to use. The compiler will by default now generate warnings for calls to functions in Erlang/OTP known to be always unsafe. Furthermore,xrefcan now be used to find calls to unsafe functions and functions that lack documentation. -
The SSH daemon now defaults to disabled for shell and exec services, implementing the “secure by default” principle. This prevents authenticated users from executing arbitrary Erlang code unless explicitly configured.
-
The SFTP subsystem is no longer enabled by default when starting an SSH daemon.
-
In SSL, the post quantum hybrid algorithm x25519mlkem768 is now the most preferred key exchange group in the default configuration.
-
The module
io_ansiallows the user to emit Virtual Terminal Sequences (also known as ANSI sequences) to the terminal in order to add colors/styling to text or to create fully fledged terminal applications. -
The new
ct_doctestmodule allows the user to test documentation examples in Erlang module docs and documentation files. -
The
ignore_xrefattribute has been handled as a post-analysis filter by build tools such as Rebar3. In this release, [xref] itself does the filtering, ensuring that all tooling that callsxreffor any purpose can rely on these declarations to just work.
General #
-
In the default code path for the Erlang system, the current working directory (
.) is now in the last position instead of the first. -
There is no longer a 32-bit Erlang/OTP build for Windows.
New language features #
-
Native records as described in EEP-79 has been implemented. A native record is a data structure similar to the traditional tuple-based records, except that is a true data type. Native records are considered experimental in Erlang/OTP 29 and possibly also in Erlang/OTP 30.
-
The new
is_integer/3guard BIF makes it possible to easily verify that a value is both an integer and within a certain range. For example:is_integer(I, 0, 100) -
Multi-valued comprehensions according to EEP 78 are now supported. For example,
[-I, I || I <- [1, 2, 3]]will produce[-1,1,-2,2,-3,3]. -
By enabling the
compr_assignfeature, it is now possible to bind variables in a comprehensions. For example:[H || E <- List, H = erlang:phash2(E), H rem 10 =:= 0]
Compiler and JIT improvements #
-
In the documentation for the [
compile] module, there is now a section with recommendations for implementors of languages running on the BEAM. -
The JIT now generates better code for matching or creating binaries with multiple little-endian segments.
-
The compiler will generate more efficient code for map comprehensions with constant values that don’t depend on the generator. Example:
#{K => 42 || K <- List}
Compiler warnings #
There are several new compiler warnings enabled by default. For each such warning, there is an option to disable it.
-
There will now be a warning when using the
catchoperator, which has been deprecated for a long time. It is recommended to instead usetry…catchbut is also possible to disable the warning by using thenowarn_deprecated_catchoption. -
There will now be a warning when exporting variables out of a subexpression. For example:
file:open(File, AllOpts = [write, {encoding,utf8}]). This warning can be disabled using thenowarn_export_var_subexprcompiler option. -
The compiler will now warn for uses of the
andandoroperators. This warning can be disabled using thenowarn_obsolete_bool_opcompiler option. -
The compiler will now warn for matches such as
{a,B} = {X,Y}, which is better written as{a=X,B=Y}. This warning can be disabled using thenowarn_match_alias_patsoption.
For a long time, there has been a warning for using the obsolete guard
tests (such as list(L) instead of is_list(L). In Erlang/OTP 30, the
old guards will be removed from the language.
STDLIB #
- There are new functions for randomly permutating a list:
rand:shuffle/1andrand:shuffle_s/2.
SSH #
- The default key exchange algorithm is now mlkem768x25519-sha256, a hybrid quantum-resistant algorithm combining ML-KEM-768 with X25519. This provides protection against both classical and quantum computer attacks while maintaining backward compatibility through automatic fallback to other algorithms when peers don’t support it.
For a full list and more details about new features and potential incompatibilities see the README.