Eine Anmerkung an C/C++-Entwickler: Makros funktionieren ähnlich wie Präprozessor-Anweisungen. Während jedoch #define im Prinzip bloße Textersetzungen vollzieht, kennen Julias Makros die Ausführungsumgebung und nehmen daher sehr viel differenziertere Modifikationen vor.
Listing 17 zeigt den Nachbau und die Anwendung des in Listing 15 vorgestellten Makros @assert. Die Zeilen 2 bis 6 bestimmen den Ausdruck, den das Makro zurückliefert. Zeile 3 prüft, ob das Argument ex false ergibt; in dem Fall soll Zeile 4 die Fehlermeldung msg ausgeben. Das Dollarzeichen dient, ähnlich wie bei der String-Interpolation in der Bash, als Platzhalter der Argumente. Ohne es würde Julia die Makro-Ausführung mit einem Fehler quittieren: UndefVarError: ex not defined. Der Aufruf von @Makroexpand in Zeile 12 zeigt den Ausdruck an, den das Makro zurückliefert.
Listing 17
Makro myassert(ex, msg)
quote
if !$ex
println($msg)
end
end
end
@myassert 0==1 "fail"
#> fail
@Makroexpand @myassert 0==1 "fail"
#> quote
if !(0 == 1)
Main.println("fail")
end
end
Listing 18 definiert ein Makro, das den im ersten Argument ex übergebenen Ausdruck n-mal wiederholt. Zu guter Letzt definiert Listing 19 ein Makro, das ähnlich wie das eingebaute @time arbeitet und die Ausführungsdauer eines Ausdrucks ermittelt. Die zweite Anwendung von @mytime zeigt zudem, wie Sie mehrzeilige Ausdrücke an ein Makro übergeben, sofern sich diese nicht ohnehin im Körper etwa einer Funktionsdefinition oder einer for-Schleife befinden.
Listing 18
Makro repeat(ex, n)
quote
for n in 1:$n
$ex
end
end
end
@repeat print("ja") 3
#> jajaja
Listing 19
using Dates
Makro mytime(ex)
quote
t1 = now()
result = $ex
t2 = now()
println(t2-t1)
end
end
@mytime rand(100000);
#> 3 milliseconds
@mytime begin
sleep(0.1)
sleep(0.2)
end
#> 352 milliseconds
Fazit
Falls Ihnen die selbstreferenziellen Zusammenhänge zwischen Makros und Ausdrücken Kopfzerbrechen bereiten: Lassen Sie sich nicht zu schnell entmutigen. Makroprogrammierung und die Manipulation von Expressions gehören zu den anspruchsvollsten Julia-Themen. Es lohnt sich aber, am Ball zu bleiben, denn gerade diese Sprachmittel stellen entscheidende Bausteine für Julias Flexibilität und Leistungsfähigkeit dar.
Die gegebenen Beispiele konnten das Thema nicht umfassend vorstellen. Ein dritter Teil dieser Serie liefert hierzu in der nächsten Ausgabe einen Nachschlag und zeigt zudem, wie Sie Berechnungen auf mehrere Prozessorkerne verteilen. (tle)
Der Autor
Pit Noack arbeitet als freiberuflicher Medienkünstler, Autor und Dozent, dem es Spaß macht, Programmiersprachen anzutesten.
Infos
- Julia: Pit Noack, “Einfach schnell”, RPG 06/2020, S. 80, https://www.raspi-geek.de/43351
- Julia herunterladen: https://julialang.org/downloads/
- Julia-Dokumentation zum Thema Links: https://docs.julialang.org/en/v1/manual/types/
- Übersicht verfügbarer Julia-Erweiterungen https://juliaobserver.com/packages
- Anwendungsbeispiele für das PyPlot-Package: https://gist.github.com/gizmaa/7214002





