Der Abstract Syntax Tree (AST), auch quoted expression genannt, ist eine Möglichkeit, Code als Daten darzustellen.
Jeder Knoten im AST ist ein Tupel mit drei Elementen.
# AST representation of:
# 2 + 3
{:+, [], [2, 3]}
Das erste Element, ein Atom, ist die Operation. Das zweite Element, eine Keyword-Liste, sind die Metadaten. Das dritte Element ist eine Liste von Argumenten, die weitere Knoten enthält. Literale wie Ganzzahlen, Atome und Strings werden im AST als sie selbst dargestellt, nicht als Tupel mit drei Elementen.
Elixir-Code in ASTs umzuwandeln und ASTs wieder zurück in Code, gehört zur Standardbibliothek. Funktionen für die Arbeit mit ASTs findest du in den Modulen Code (zum Beispiel um einen String mit Code in einen AST umzuwandeln) und Macro (zum Beispiel um den AST zu durchlaufen oder ihn in einen String umzuwandeln).
Beachte, dass alle Funktionen der Standardbibliothek den Namen „quoted“ verwenden, um den AST zu bezeichnen (kurz für quoted expression).
Die Spezialform, um Code in einen AST umzuwandeln, heißt quote. Sie nimmt einen Block entgegen und gibt dessen AST zurück.
quote do
2 + 3 - 1
end
# => {:-, [], [
# {:+, [], [2, 3]},
# 1
# ]}
Die Möglichkeit, Code als AST darzustellen, ist der Kern der Metaprogrammierung in Elixir. Makros, also die Möglichkeit, Elixir-Code zu schreiben, der Elixir-Code erzeugt, funktionieren, indem sie ASTs als Ausgabe zurückgeben.
Ein weiterer Anwendungsfall für ASTs ist die statische Codeanalyse, wie sie Exercisms eigenes Tool betreibt, der Analyzer. Du kennst ihn vielleicht schon als den kleinen Bot, der Kommentare zu deinen Lösungen hinterlässt.