In Elixir, as in Lisp, you can transform your code as a data structure into new code. This is importantly used in Ecto, the de-facto object data mapper in Elixir. It’s also used in Absinthe, a library from the posted link for making GraphQL APIs.
* efficient utf8 binary strings (which is actually conforms with utf8 standard), no mixup with charlists
* mix etc standard tooling
* macros
* enum stuff
* pipeline operator "|>", which by its mere existence enforces input/output param's consistency in user-written functions
etc
A big one is that Elixir allows rebinding of a variable. Erland does not, which tends to lead to ugly names since in erlang you can't do common reassignment patterns like x = x * someConversionFactor.
* Tests inside documentation.
* Macros.
* Protocols.
* `mix xref` has a family of sub-commands that gives you good code analysis (callers, callees etc.)
* First-class Unicode support. All strings are UTF-8 by default (you can fallback to ASCII if you need it; there are also good transcoding libraries in both Elixir and Erlang).
Elixir's whole reason for existence is to make the Erlang programming model easier to use. Try it and see if it does.
The two really big features are macros and protocols.