Note: Erlang 17.1 contains a regression in its wildcard implementation that causes tools like rebar to fail. If you have a project with rebar dependencies and is using Erlang 17.1, remember to update to at least Erlang 17.3.
- [CLI] Add support for
--werlin Windows bash-like shells - [Dict] Add
Dict.get_and_update/3which behaves similar to the now deprecated Access protocol - [Dict] Add
Dict.get_lazy/3,Dict.pop_lazy/3andDict.put_new_lazy/3 - [EEx] Add
:trimoption to EEx that automatically trims the left side of<%and right side%>if only spaces and new lines preceed/follow them - [Enum] Add
Enum.sample/1,Enum.minmax/1,Enum.minmax_by/2,Enum.reverse_slice/3,Enum.dedup/1,Enum.dedup_by/2,Enum.usort/1andEnum.usort_by/2 - [Enum] Inline common map usage in
Enumfunctions for performance - [ExUnit] Add number of skipped tests to
ExUnitoutput - [ExUnit] Make timeout configurable for the whole test suite via the
:timeoutconfiguration - [ExUnit] Allow moduledoc to be filtered/skipped in doctests
- [File] Add
File.lstat/1andFile.lstat/1that works likeFile.stat/1but is able to return symlink information (i.e. it does not traverse symlinks) - [IEx] Add
b/1helper that shows documentation for behaviour modules and its callback functions - [Integer] Add
Integer.digits/2andInteger.undigits/2 - [Inspect] Add the
:safeoption toinspect/2and make it safe by default, meaning failures while inspecting won't trigger other failures. Instead, it will be wrapped in an exception which is properly formatted - [Logger] Format and handle 17.4 onward stacktraces
- [Kernel] No longer include
:cryptoand:syntax_toolsas dependencies. The former is only needed if you have encrypted debug info (therefore you can add:cryptoas a dependency manually) and the latter is no longer used - [Kernel] Raise when
var.Aliassyntax is used and it does not expand to an atom at compile time (previously it just warned) - [Kernel]
::/2is now a special form - [Mix] Check Elixir version right after archive installation and provide feedback if there is a mismatch
- [Mix] Allow rebar dependencies with
mix.exsto be compiled with Mix - [Mix] Allow rebar dependencies to be specified via
:path - [Record] Expand attributes and macros when extracting records
- [Stream] Add
Stream.dedup/1,Stream.dedup_by/2,Stream.usort/1andStream.usort_by/2 - [String] Support calculation of the jaro distance between strings (usually names) via
String.jaro_distance/2. This is used by Mix to support "Did you mean?" feature when a task does not exist - [StringIO]
StringIO.flush/1was added to flush the output of a StringIO device - [URI] Default ports were added for "ws" and "wss" schemas
- [Code]
:delegate_locals_tofailed to delegate to the chosen module in many situations and messed up stacktraces. This option has therefore been replaced by imports - [EEx] Allow EEx interpolation to also apply inside quotations
<%%= ... %> - [Exception] Do not fail when calculating an exception message, even if the message is invalid
- [ExUnit] Skipped tests now correctly count towards the total of tests in the result returned by
ExUnit.run/0 - [ExUnit] Fix a bug where failures when inspecting data structure or retrieving error messages could bring the whole ExUnit runner down
- [ExUnit] Ensure the Logger is flushed when running ExUnit via Mix
- [Kernel] Throw syntax error for undefind atom/alias syntax
:foo.Bar - [Mix] Ensure automatic protocol consolidation via
:consolidate_protocolsis triggered in umbrella apps - [Module] Do not accept non-Elixir module names in
Module.split/1 - [Regex] Fix splitting of empty strings with regexes when trim is set to
true. Now bothString.split/3andRegex.split/3return an empty list when called with an empty string and trim is enabled - [Regex] Fix
Regex.replace/4so it doesn't discard escape characters
- [Regex] Ungreedy option
ris deprecated in favor ofU(which is standard in regular expressions in other languages) - [Enum]
Enum.uniq/2is deprecated in favor ofEnum.uniq_by/2
- [Access] The Access protocol is deprecated. The Access protocol relies on the code server in development and test mode (when protocol consolidation is not applied) and it generated a bottleneck when working with multiple processes and the Access protocol was invoked hundreds of times (which is not uncommon). In future releases the Access protocol will be removed although we will keep the
Accessmodule around for compatibility reasons