-
enhancements
- [ExUnit]
capture_ionow captures prompt by default - [Mix] Automatically import git dependencies from Rebar
- [Mix] Support for dependencies directly from the umbrella application
- [Regex] Add
Regex.escape - [String] Add
String.contains? - [URI] Implement
Binary.Chars(akato_binary) forURI.Info
- [ExUnit]
-
bug fix
- [HashDict] Ensure HashDict uses exact match throughout its implementation
- [IEx] Do not interpret ANSI codes in IEx results
- [IEx] Ensure --cookie is set before accessing remote shell
- [Kernel] Do not ignore nil when dispatching protocols to avoid infinite loops
- [Mix] Fix usage of shell expressions in
Mix.Shell.cmd - [Mix] Start the application by default on escripts
-
deprecations
-
backwards incompatible changes
-
enhancements
- [IEx] Limit the number of entries kept in history and allow it to be configured
- [Kernel] Add
String.start_with?andString.end_with? - [Typespec] Allow keywords, e.g.
[foo: integer, bar: boolean | module], in typespecs
-
bug fix
- [Dict]
Enum.to_listandDict.to_listnow return the same results for dicts - [IEx] Enable shell customization via the
IEx.Optionsmodule - [Kernel] Fix a bug where
unquote_splicingdid not work on the left side of a stab op - [Kernel] Unused functions with cyclic dependencies are now also warned as unused
- [Mix] Fix a bug where
mix deps.getwas not retrieving nested dependencies - [Record] Fix a bug where nested records cannot be defined
- [Record] Fix a bug where a record named Record cannot be defined
- [Dict]
-
enhancements
- [ExUnit]
ExUnit.CaptureIOnow accepts an input to be used during capture - [IEx] Add support for .iex files that are loaded during shell's boot process
- [IEx] Add
import_file/1helper
- [ExUnit]
-
backwards incompatible changes
- [Enum]
Enum.Iteratorwas replaced by the more composable and functionalEnumerableprotocol which supports reductions - [File]
File.iterator/1andFile.biniterator/1have been removed in favor of the safeFile.iterator!/1andFile.biniterator!/1ones - [Kernel] Erlang R15 is no longer supported
- [Kernel] Elixir modules are now represented as
Elixir.ModuleName(using.instead of-as separator)
- [Enum]
-
enhancements
- [CLI] Flags
-pand-prfails if pattern match no files - [CLI] Support
--hiddenand--cookieflags for distributed Erlang - [Enum] Add
Enum.to_list/1,Enum.member?/2,Enum.uniq/2,Enum.max/1,Enum.max/2,Enum.min/1andEnum.min/2 - [ExUnit] Add
ExUnit.CaptureIOfor IO capturing during tests - [ExUnit] Consider load time on ExUnit time reports
- [IEx] Support
lswith colored output - [IEx] Add
#iex:breakto break incomplete expressions - [Kernel] Add
Enum.at,Enum.fetchandEnum.fetch! - [Kernel] Add
String.to_integerandString.to_float - [Kernel] Add
Dict.take,Dict.drop,Dict.split,Dict.popandDict.fetch! - [Kernel] Many optimizations for code compilation
- [Kernel]
incan be used with right side expression outside guards - [Kernel] Add
Node.get_cookie/0andNode.set_cookie/2 - [Kernel] Add
__DIR__ - [Kernel] Expand macros and attributes on quote, import, alias and require
- [Kernel] Improve warnings related to default arguments
- [Keyword] Add
Keyword.delete_first/2 - [Mix] Add
local.rebarto download a local copy of rebar, and changedeps.compileto use it if needed - [Mix] Support umbrella applications
- [Mix] Load beam files available at
MIX_PATHon CLI usage - [String] Add
String.valid?andString.valid_character?
- [CLI] Flags
-
bug fix
- [ExUnit] Handle exit messages from in ExUnit
- [ExUnit] Failures on ExUnit's setup_all now invalidates all tests
- [Kernel] Ensure we don't splice keyword args unecessarily
- [Kernel] Private functions used by private macros no longer emit an unused warning
- [Kernel] Ensure Elixir won't trip on empty receive blocks
- [Kernel]
String.slicenow returns an empty string when out of range by 1 - [Mix] Generate manifest files after compilation to avoid depending on directory timestamps and to remove unused .beam files
- [Path]
Path.expand/2now correctly expands~in the second argument - [Regex] Fix badmatch with
Regex.captures(%r/(.)/g, "cat") - [URI] Downcase host and scheme and URIs
-
deprecations
- [Code]
Code.evalis deprecated in favor ofCode.eval_string - [Exception]
Exception.format_entryis deprecated in favor ofException.format_stacktrace_entry - [ExUnit]
assert left inlist rightis deprecated in favor ofassert left in right - [IO]
IO.getbis deprecated in favor ofIO.getn - [List]
List.member?/2is deprecated in favor ofEnum.member?/2 - [Kernel]
var_contextin quote was deprecated in favor ofcontext - [Kernel]
Enum.at!andDict.get!is deprecated in favor ofEnum.fetch!andDict.fetch!
- [Code]
-
backwards incompatible changes
- [Dict]
List.Dictwas moved toListDict - [IO]
IO.gets,IO.getnand friends now return binaries when reading from stdio - [Kernel] Precedence of
|>has changed to lower to support constructs like1..5 |> Enum.to_list - [Mix]
mix escriptizenow receives arguments as binaries
- [Dict]
-
enhancements
- [ExUnit] Use ANSI escape codes in CLI output
- [ExUnit] Include suite run time on CLI results
- [ExUnit] Add support to doctests, allowing test cases to be generated from code samples
- [File] Add
File.lsandFile.ls! - [IEx] Support
pwdandcdhelpers - [Kernel] Better error reporting for invalid bitstring generators
- [Kernel] Improve meta-programming by allowing
unquoteondef/2,defp/2,defmacro/2anddefmacrop/2 - [Kernel] Add support to R16B new functions:
insert_elem/3anddelete_elem/2 - [Kernel] Import conflicts are now lazily handled. If two modules import the same functions, it will fail only if the function is invoked
- [Mix] Support
--coveron mix test andtest_coverageon Mixfiles - [Record] Each record now provides
Record.optionswith the options supported by itsnewandupdatefunctions
-
bug fix
- [Binary] inspect no longer escapes standalone hash
# - [IEx] The
hhelper can now retrieve docs for special forms - [Kernel] Record optimizations were not being triggered in functions inside the record module
- [Kernel] Aliases defined inside macros should be carried over
- [Kernel] Fix a bug where nested records could not use the Record[] syntax
- [Path] Fix a bug on
Path.expandwhen expanding paths starting with~
- [Binary] inspect no longer escapes standalone hash
-
deprecations
- [Kernel]
setelem/3is deprecated in favor ofset_elem/3 - [Kernel]
function(:is_atom, 1)is deprecated in favor offunction(is_atom/1)
- [Kernel]
-
backwards incompatible changes
-
[Kernel]
unquotenow only applies to the closest quote. If your code contains a quote that contains another quote that calls unquote, it will no longer work. UseMacro.escapeinstead and pass your quoted contents up in steps, for example:quote do quote do: unquote(x) endshould become:
quote do unquote(Macro.escape(x)) end
-
-
enhancements
- [ExUnit] Tests can now receive metadata set on setup/teardown callbacks
- [ExUnit] Add support to ExUnit.CaseTemplate to share callbacks in between test cases
- [IO] Add
IO.ANSIto make it easy to write ANSI escape codes - [Kernel] Better support for Unicode lists
- [Kernel] Reduce variables footprint in
case/receiveclauses - [Kernel] Disable native compilation when on_load attributes is present to work around an Erlang bug
- [Macro]
Macro.expandalso considers macros from the current__ENV__module - [Mix] Improve support for compilation of
.erlfiles - [Mix] Add support for compilation of
.yrland.xrlfiles - [OptionParser] Switches are now overridden by default but can be kept in order if chosen
- [Typespec] Better error reporting for invalid typespecs
-
bug fix
- [Mix] Allow Mix projects to be generated with just one letter
-
backwards incompatible changes
- [Kernel]
before_compileandafter_compilecallbacks now receive the environment as first argument instead of the module
- [Kernel]
-
deprecations
- [ExUnit] Explicitly defined test/setup/teardown functions are deprecated
- [Kernel] Tidy up and clean
quoteAPI - [Kernel] Old
:local.(args)syntax is deprecated - [Process]
Process.selfis deprecated in favorKernel.self
-
enhancements
- [Binary] Support
<< "string" :: utf8 >>as in Erlang - [Binary] Support
\aescape character in binaries - [Binary] Support syntax shortcut for specifying size in bit syntax
- [CLI] Support
--appoption to start an application and its dependencies - [Dict] Support
put_newinDictandKeyword - [Dict] Add
ListDictand a fasterHashDictimplementation - [ExUnit] ExUnit now supports multiple runs in the same process
- [ExUnit] Failures in ExUnit now shows a tailored stacktrace
- [ExUnit] Introduce
ExUnit.ExpectationErrorto provide better error messages - [Kernel] Introduce
Application.Behaviourto define application module callbacks - [Kernel] Introduce
Supervisor.Behaviourto define supervisors callbacks - [Kernel] More optimizations were added to Record handling
- [Kernel]
?\xand?\are now supported ways to retrieve a codepoint - [Kernel] Octal numbers can now be defined as
0777 - [Kernel] Improve macros hygiene regarding variables, aliases and imports
- [Mix] Mix now starts the current application before run, iex, test and friends
- [Mix] Mix now provides basic support for compiling
.erlfiles - [Mix]
mix escriptizeonly generates escript if necessary and accept--forceand--no-compileas options - [Path] Introduce
Pathmodule to hold filesystem paths related functions - [String] Add
String.capitalizeandString.slice - [System] Add
System.tmp_dir,System.cwdandSystem.user_home
- [Binary] Support
-
bug fix
- [Kernel]
importwithonlyaccepts functions starting with underscore - [String]
String.firstandString.lastreturn nil for empty binaries - [String]
String.rstripandString.lstripnow verify if argument is a binary - [Typespec] Support
...inside typespec's lists
- [Kernel]
-
backwards incompatible changes
- [Kernel] The AST now allows metadata to be attached to each node. This means the second item in the AST is no longer an integer (representing the line), but a keywords list. Code that relies on the line information from AST or that manually generate AST nodes need to be properly updated
-
deprecations
- [Dict] Deprecate
Binary.DictandOrdDictin favor ofHashDictandListDict - [File] Deprecate path related functions in favor of the module
Path - [Kernel] The
/>operator has been deprecated in favor of|> - [Mix]
Mix.Project.sourcesis deprecated in favor ofMix.Project.config_files - [Mix]
mix iexis no longer functional, please useiex -S mix - [OptionParser]
:flagsoption was deprecated in favor of:switchesto support many types
- [Dict] Deprecate
-
enhancements
- [CLI]
--debug-infois now true by default - [ExUnit] Make ExUnit exit happen in two steps allowing developers to add custom
at_exithooks - [IEx] Many improvements to helpers functions
h/1,s/1and others - [Kernel] Functions defined with
fncan now handle many clauses - [Kernel] Raise an error if clauses with different arities are defined in the same function
- [Kernel]
functionmacro now accepts arguments inM.f/aandf/aformats - [Macro] Improvements to
Macro.to_binary - [Mix] Mix now echoes the output as it comes when executing external commands such as git or rebar
- [Mix] Mix now validates
applicationcallback's values - [Record] Record accessors are now optimized and can be up to 6x faster in some cases
- [String] Support
\xXXand\x{HEX}escape sequences in strings, char lists and regexes
- [CLI]
-
bug fix
- [Bootstrap] Compiling Elixir source no longer fails if environment variables contain utf-8 entries
- [IEx] IEx will now wait for all command line options to be processed before starting
- [Kernel] Ensure proper stacktraces when showing deprecations
-
deprecations
- [Enum]
Enum.qsortis deprecated in favor ofEnum.sort - [List]
List.sortandList.uniqhave been deprecated in favor of theirEnumcounterparts - [Record] Default-based generated functions are deprecated
- [Typespec] Enhancements and deprecations to the
@spec/@callbackand the fun type syntax
- [Enum]
-
enhancements
- [IEx] Only show documented functions and also show docs for default generated functions
- [IO] Add
IO.binread,IO.binwriteandIO.binreadlineto handle raw binary file operations - [ExUnit] Add support for user configuration at
HOME/.ex_unit.exs - [ExUnit] Add support for custom formatters via a well-defined behaviour
- [Kernel] Add support for
defrecordp - [Kernel] Improved dialyzer support
- [Kernel] Improved error messages when creating functions with aliases names
- [Mix] Improve SCM behaviour to allow more robust integration
- [Mix] Changing deps information on
mix.exsforces users to fetch new dependencies - [Mix] Support (parallel) requires on mix run
- [Mix] Support
-qwhen running tests to compile only changed files - [String] Support
String.downcaseandString.upcaseaccording to Unicode 6.2.0 - [String] Add support for graphemes in
String.length,String.atand others - [Typespec] Support
@opaqueas attribute - [Typespec] Define a default type
tfor protocols and records - [Typespec] Add support for the access protocol in typespecs
-
bug fix
- [Kernel] Fix an issue where variables inside clauses remained unassigned
- [Kernel] Ensure
defoverridablefunctions can be referred in many clauses - [Kernel] Allow keywords as function names when following a dot (useful when integrating with erlang libraries)
- [File] File is opened by default on binary mode instead of utf-8
-
deprecations
- [Behaviour]
defcallback/1is deprecated in favor ofdefcallback/2which matches erlang@callbacks - [Enum]
Enum.timesis deprecated in favor of using ranges - [System]
haltmoved toSystemmodule
- [Behaviour]
-
enhancements
- [Behaviour] Add Behaviour with a simple callback DSL to define callbacks
- [Binary] Add a Dict binary that converts its keys to binaries on insertion
- [Binary] Optimize
Binary.Inspectand improve inspect for floats - [CLI] Support
--detachedoption - [Code]
Code.string_to_astsupports:existing_atoms_onlyas an option in order to guarantee no new atoms is generated when parsing the code - [EEx] Support
<%%and<%#tags - [ExUnit] Support
after_spawncallbacks which are invoked after each process is spawned - [ExUnit] Support context data in
setup_all,setup,teardownandteardown_allcallbacks - [IEx] Support
after_spawncallbacks which are invoked after each process is spawned - [Kernel] Better error messages when invalid options are given to
import,aliasorrequire - [Kernel] Allow partial application on literals, for example:
{ &1, &2 }to build tuples or[&1|&2]to build cons cells - [Kernel] Added
integer_to_binaryandbinary_to_integer - [Kernel] Added
float_to_binaryandbinary_to_float - [Kernel] Many improvements to
unquoteandunquote_splicing. For example,unquote(foo).unquote(bar)(args)is supported and no longer need to be written viaapply - [Keyword] Keyword list is no longer ordered according to Erlang terms but the order in which they are specified
- [List] Add
List.keyreplaceandList.keystore - [Macro] Support
Macro.safe_termwhich returns:okif an expression does not execute code and is made only of raw data types - [Mix] Add support for environments - the current environment can be set via
MIX_ENV - [Mix] Add support for handling and fetching dependencies' dependencies
- [Module] Support module creation via
Module.create - [Range] Support decreasing ranges
- [Record] Improvements to the Record API, added
Record.defmacros - [Regex] Add
:returnoption toRegex.runandRegex.scan - [String] Add a String module responsible for handling UTf-8 binaries
-
bug fix
- [File]
File.cpandFile.cp_rnow preserves the file's mode - [IEx] Fix a bug where printing to
:stdioonIExwas causing it to hang - [Macro] Fix a bug where quoted expressions were not behaving the same as their non-quoted counterparts
- [Mix]
mix deps.get [DEPS]now only gets the specified dependencies - [Mix] Mix now exits with status 1 in case of failures
- [Protocol] Avoid false positives on protocol dispatch (a bug caused the dispatch to be triggered to an invalid protocol)
- [File]
-
backwards incompatible changes
- [ExUnit]
setupandteardowncallbacks now receives the test name as second argument - [Kernel] Raw function definition with
def/4,defp/4,defmacro/4,defmacrop/4now evaluates all arguments. The previous behaviour was accidental and did not properly evaluate all arguments - [Kernel] Change tuple-related (
elemandsetelem), Enum functions (find_index,nth!andtimes) and List functions (List.key*) to zero-index
- [ExUnit]
-
deprecations
- [Code]
Code.require_fileandCode.load_filenow expect the full name as argument - [Enum]
List.reverse/1andList.zip/2were moved toEnum - [GenServer] Rename
GenServer.BehaviortoGenServer.Behaviour - [Kernel] Bitstring syntax now uses
::instead of| - [Kernel]
Erlang.syntax is deprecated in favor of simply using atoms - [Module]
Module.read_attributeandModule.add_attributedeprecated in favor ofModule.get_attributeandModule.put_attributewhich mimics Dict API
- [Code]
-
incompatible changes
- [Kernel] Compile files now follow
Elixir-ModuleNameconvention to solve issues with Erlang embedded mode. This removes the__MAIN__pseudo-variable as modules are now located insideElixirnamespace - [Kernel]
__using__callback triggered byusenow receives just one argument. Caller information can be accessed via macros using__CALLER__ - [Kernel] Comprehensions syntax changed to be more compatible with Erlang behavior
- [Kernel] loop and recur are removed in favor of recursion with named functions
- [Module] Removed data functions in favor of unifying the attributes API
- [Kernel] Compile files now follow
-
deprecations
- [Access] The semantics of the access protocol were reduced from a broad query API to simple data structure key-based access
- [ExUnit] Some assertions are deprecated in favor of simply using
assert() - [File]
File.read_infois deprecated in favor ofFile.stat - [IO]
IO.printis deprecated in favor ofIO.write - [Kernel] Deprecate
__LINE__and__FUNCTION__in favor of__ENV__.lineand__ENV__.function - [Kernel] Deprecate
in_guardin favor of__CALLER__.in_guard? - [Kernel]
referis deprecated in favor ofalias - [Module]
Module.add_compile_callback(module, target, callback)is deprecated in favor ofModule.put_attribute(module, :before_compile, { target, callback }) - [Module]
Module.function_defined?is deprecated in favor ofModule.defines? - [Module]
Module.defined_functionsis deprecated in favor ofModule.definitions_in
-
enhancements
- [Enum] Enhance Enum protocol to support
Enum.count - [Enum] Optimize functions when a list is given as collection
- [Enum] Add
find_index,nth!and others - [ExUnit] Support setup and teardown callbacks
- [IEx] IEx now provides autocomplete if the OS supports tty
- [IEx] IEx now supports remsh
- [IEx] Elixir now defaults to compile with documentation and
dcan be used in IEx to print modules and functions documentation - [IEx] Functions
candmare available in IEx to compile and print available module information. Functionshandvare available to show history and print previous commands values - [IO/File] Many improvements to
FileandIOmodules - [Kernel] Operator
!is now allowed in guard clauses - [Kernel] Introduce operator
=~for regular expression matches - [Kernel] Compiled docs now include the function signature
- [Kernel]
defmoduledo not start a new variable scope, this improves meta-programming capabilities - [Kernel] quote special form now supports line and unquote as options
- [Kernel] Document the macro
@and allow attributes to be read inside functions - [Kernel] Add support to the
%Rsigil. The same as%r, but without interpolation or escaping. Both implementations were also optimized to generate the regex at compilation time - [Kernel] Add
__ENV__which returns aMacro.Envrecord with information about the compilation environment - [Kernel] Add
__CALLER__inside macros which returns aMacro.Envrecord with information about the calling site - [Macro] Add
Macro.expand, useful for debugging what a macro expands to - [Mix] First Mix public release
- [Module] Add support to
@before_compileand@after_compilecallbacks. The first receives the module name while the latter receives the module name and its object code - [OptionParser] Make OptionParser public, add support to flags and improved switch parsing
- [Range] Add a Range module with support to
inoperator (x in 1..3) and iterators - [Record] Allow
Record[_: value]to set a default value to all records fields, as in Erlang - [Record] Records now provide a
to_keywordsfunction - [Regex] Back references are now properly supported
- [System] Add
System.find_executable
- [Enum] Enhance Enum protocol to support
- First official release