Der Präprozessor in Operno verwaltet Aufgaben vor der Ausführung, um ein Skript mit Makros zu kürzen und durch Symbole lesbarer zu machen. Außerdem bietet der Präprozessor einige spezielle Funktionen an (z.B. das Einbinden von Quelldateien).
Alle Symbole/Makros sind ein Teil des Präprozessor-Objekts "pre". Nach der Kompilierung einer Quelldatei wurden alle Symbole und Makros ersetzt und das Präprozessor-Objekt mit allen Unterobjekten ist nicht mehr im kompilierten Code vorhanden. Jedes Symbol kann vor der Ausführung durch ein "#" definiert und angesprochen werden.
Ein Symbol ist eine Variable, die einen Wert besitzt. Jedes Mal, wenn man den Namen des Symbols wieder angibt, wird diese Angabe durch den Wert der Variable ersetzt.
#author = "Josef Sniatecki"
out #author 'Wird vor der Ausführung ersetzt
#code{
a = 132
b = 71
}
out #code\a, #code\b '= 132, 71
Ein Makro ist eine Funktion, die einen Code als String zurückgibt und dabei Parameter als Strings erwarten kann. Die angegebenen Parameter werden automatisch in Strings umgewandelt, ohne Anführungszeichen anzugeben. Möchte man also einen Parameter als Zahl haben, muss man diesen durch die Klassenmethode ":eval" evaluieren lassen.
#call n times(code, times){
return (code + "#n") * times:eval
}
#call n times(out "Hello world!", 3)
'Gibt 3 Mal "Hello world!" aus
Wird eine Klammer direkt nach dem Präprozessor-Symbol "#" angehängt, so wird der Inhalt der Klammer noch vor der Ausführung ausgewertet und an die jeweilige Stelle des Codes eingefügt. Auch Blöcke können direkt nach dem Symbol angehängt werden, um ganze Befehlsfolgen vor der Ausführung zu absolvieren.
Der Namensraum in den Klammern ist immer das Präprozessor-Objekt mit all seinen Symbolen und Makros.
out { 3 + #(2 + 2) * 2 } '= { 3 + 4 * 2 }
#{
out pi '= 3.14...
out version '= 5.30
}
Möchte man einen ASCII-Code eines Zeichens in den Quellcode einfügen, so setzt man das Präprozessor-Symbol ein "$" und das umzuwandelnde Zeichen.
out #$A '= 65
Folgende Funktionen sind intern im Präprozessor eingebunden und sind in jedem Quellcode verfügbar:
Funktion | Beschreibung |
---|---|
del |
Entfernt die angegebenen Objekt aus dem Präprozessor. |
if |
Wahl eines Code-Blocks mittels If-Verzweigung. |
include, inc |
Bindet die angegebenen Dateien ein. |
date |
Gibt den Datum als String zur Kompilierzeit zurück. |
time |
Gibt die aktuelle Zeit als String zur Kompilierzeit zurück. |
out |
Zeigt die angegebenen Wert noch vor der Ausführung an. |
#include("Example source.op_c") 'Bindet eine Datei ein
out #date 'Gibt den Datum aus
#x = 0
#del(x) 'Löscht das Symbol