Aus Raspberry Pi Geek 07-08/2020

Typen, Module, Plots und Makros in der Programmiersprache Julia (Seite 4)

Abbildung 1: Eine mit PyPlot dargestellte Sinusfunktion.

Abbildung 1: Eine mit PyPlot dargestellte Sinusfunktion.

Sofern noch nicht vorhanden, öffnet Julia beim Ausführen eines Grafikbefehls wie plot() ein neues Grafikfenster. Weitere Grafikbefehle beziehen sich dann auf das offene Fenster. Die Software erlaubt es entsprechend, mehrere Kurven (Abbildung 2) in ein Fenster zu zeichnen (Listing 12).

Abbildung 2: Da Julia jeweils ins gleiche Fenster schreibt, lassen sich auch mehrere Sinuskurven einer Abbildung übereinanderlegen.

Abbildung 2: Da Julia jeweils ins gleiche Fenster schreibt, lassen sich auch mehrere Sinuskurven einer Abbildung übereinanderlegen.

Listing 12

using PyPlot
x = collect(-2*pi:0.01:2*pi)
for amp in 1:5
  y = sin.(x).*amp
  plot(x, y, lw=5)
end

In Listing 13 löscht der Befehl clf() den Inhalt des Grafikfensters, die Funktion sleep(0.05) unterbricht die Ausführung für 0,05 Sekunden. Mit diesen beiden Funktionen lassen sich im Handumdrehen Animationen bauen.

Listing 13

using PyPlot
x = collect(0:0.01:2*pi)
for freq in 1:0.1:3
  y = sin.(freq*x)
  clf()
  plot(x, y, lw=5)
  title("sin(x*"*string(freq)*")")
  sleep(0.05)
end

PyPlot stellt eine kaum überschaubare Fülle von Typen und Optionen für die Darstellung bereit. Listing 14 demonstriert in knapper Form ein Histogramm, eine Tortengrafik und eine Heatmap (Abbildung 3). Eine Übersicht weiterer Plot-Funktionen finden Sie auf Github [5].

Listing 14

# Histogramm
> arr = rand(50)
> hist(arr, bins=10)
# Tortengrafik
> labels = ["A","B","C","D"]
> pie([1,2,3,4], labels=labels)
# Heatmap
> arr = [sin(x*y)
       for x in -8:0.1:8,
       y in -8:0.1:8]
> imshow(arr)
> colorbar()
Abbildung 3: Mit nur wenigen Zeilen Code generiert Julia verschiedene Grafiken. Im Bild von links nach rechts: ein Histogramm, eine Tortengrafik und eine Heatmap.

Abbildung 3: Mit nur wenigen Zeilen Code generiert Julia verschiedene Grafiken. Im Bild von links nach rechts: ein Histogramm, eine Tortengrafik und eine Heatmap.

Makros

Ähnlich wie bei Lisp handelt es sich bei Julia um eine homoikonische Sprache. Homoikonizität bedeutet, dass Julia-Programme letztlich aus Julia-Datenstrukturen bestehen und sich als solche manipulieren lassen. Diese Fähigkeit machen sich Makros zunutze. Was im Hintergrund bei einem Makro-Aufruf passiert, nehmen wir später noch unter die Lupe. Listing 15 zeigt zunächst einige Makros in Aktion.

Listing 15

> @isdefined Base
true
> @isdefined foo
false
> @assert 0==1 "Fehler!"
ERROR: AssertionError: Fehler!
> @time sleep(1)
1.000443 seconds (157 allocations: 2.141 KiB)
> @doc pi
  The constant pi.
  Examples
  =========
> pi
  Pi = 3.1415926535897...

Das Makro @isdefined stellt fest, ob ein Bezeichner im aktuellen Namensraum bekannt ist. @assert prüft, ob der erste an das Makro übergebene Ausdruck true ergibt. Falls nicht, gibt Julia den zweiten Ausdruck als Fehlermeldung aus. @time misst die Ausführungsdauer und den Speicherverbrauch eines Ausdrucks. @doc zeigt Dokumentationen an.

Möchten Sie ein vertieftes Verständnis darüber erwerben, was hinter den Kulissen bei der Ausführung eines Julia-Ausdrucks passiert, dann helfen die Makros @which und @edit: Sie zeigen an, welche konkrete Methode jeweils zum Zuge kommt und welche Quelldatei sie implementiert. Die mit @code_ beginnenden Makros erlauben es Ihnen, das Ausführen vom Parsing bis hinab zu den blanken Maschinenbefehlen zu verfolgen.

Expressions

Soll Julia einen Ausdruck nicht ausführen, sondern als Ausdruck behandeln, müssen Sie diesen verpacken. Diese Technik bezeichnet man als Quoting. Listing 16 zeigt dafür zwei alternative, gleichwertige Schreibweisen.

Listing 16

> ex = :(1+1);
> typeof(ex)
Expr
> quote 1+1 end;
> ex = Meta.parse("f(x) = 3*x");
> eval(ex);
> f(7)
21

Mittels Base.parse() lässt sich auch ein String in einen Ausdruck überführen. Die Funktion eval() führt Ausdrücke aus. Durch Kombinieren von Base.parse() und eval() können Sie Metaprogrammierung realisieren, also Programme schreiben, die sich selbst zur Laufzeit modifizieren.

Eigene Makros schreiben

Auf den ersten Blick sehen Makros und Funktionen sehr ähnlich aus, doch dieser Eindruck täuscht. Eine Funktion berechnet anhand von übergebenen Argumenten einen Rückgabewert. Ein Makro baut anhand eines oder mehrerer als Ausdrücke interpretierter Argumente einen neuen Ausdruck zusammen und liefert diesen zurück. Erst diesen zurückgelieferten Ausdruck führt Julia aus.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 8 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben