Aus Raspberry Pi Geek 07-08/2020

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

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

  1. Julia: Pit Noack, “Einfach schnell”, RPG 06/2020, S. 80, https://www.raspi-geek.de/43351
  2. Julia herunterladen: https://julialang.org/downloads/
  3. Julia-Dokumentation zum Thema Links: https://docs.julialang.org/en/v1/manual/types/
  4. Übersicht verfügbarer Julia-Erweiterungen https://juliaobserver.com/packages
  5. Anwendungsbeispiele für das PyPlot-Package: https://gist.github.com/gizmaa/7214002
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