Understanding quoted literals
To properly understand metaprogramming in Elixir, you first have to see how Elixir represents its code internally, and to do that, you have to understand the structure of an AST in Elixir. For any Elixir code, there exists an AST representation in Elixir. This feature helps Elixir to be bootstrapped, where most of Elixir is written in Elixir itself. Note that the Elixir representation of an AST is different from the final AST generated by the Elixir code.
The Elixir representation of a program’s abstract syntax tree is referred to as quoted literals or quoted expressions. Internally, every quoted literal in Elixir is composed of a three-element tuple.
Let’s look at the following code, for example:
{:*, [context: Elixir, import: Kernel], [a, b]} # AST for a * b
In the preceding code, we use a three-element tuple to represent an AST:
- The first element is the function being called. In this case, it is
:*
. - The second element...