Abstract syntax trees
ASTs are not just a concept of your programming language course. They are real and very useful in the real world.
Abstract syntax trees are the representation of our language compilers (or interpreters) used when parsing and translating written code into a new form, bytecode (for example, Elixir, Erlang, Python, and Java), machine code (for example, C/C++ and assembler), or another language (for example, Less, CoffeeScript, and so on). This, typically internal representation is where the majority of the language expression is broken down into its components for translation or evaluation.
Fortunately, for us, José Valim, and those before him with Erlang decided that the AST should be available to the programmer as first-class datatypes. That is, we can view, evaluate, and manipulate the AST of our code at compile time. This access is what enables metaprogramming. With access to the AST and the ability to manipulate it to suit our needs, we are able to write code that writes...