Programmiersprache: Crystal 1.1 erweitert Splats und Makros

Die von Ruby inspirierte Programmiersprache nimmt Splats in Typdefinitionen und Enumerable Literals auf, und Makros erhalten Zugriff auf das Top-Level-Modul.

Lesezeit: 2 Min.
In Pocket speichern
vorlesen Druckansicht Kommentare lesen 9 Beiträge

(Bild: Shutterstock)

Von
  • Rainald Menge-Sonnentag

Vier Monate nach der ersten stabilen Hauptversion ist Crystal 1.1 erschienen. Die von Ruby inspirierte, objektorientierte und statisch typisierte Programmiersprache erhält mit dem Release Erweiterungen für Splats und Makros sowie Ergänzungen in der Standard-Library.

Die kristallene Programmiersprache

Crystal ist eine Open-Source-Sprache, die sich vom Aufbau ebenso an Ruby orientiert wie bei der Namensgebung – als Kristall neben dem Rubin. Zur Zielgruppe gehören unter anderem erfahrene Ruby-Entwickler. Nach zehn Jahren Entwicklungszeit markierte im März Version 1.0 einen stabilen Stand. Die Programmiersprache setzt auf statische Typisierung, wobei eine explizite Definition der Typen sich häufig erübrigt, da Typinferenz die meisten herleiten kann.

Im Gegensatz zu Ruby setzt Crystal auf einen Compiler, statt den Code zur Laufzeit zu interpretieren. Eine eigene Syntax dient dem Aufruf von C-Libraries und kümmert sich um die passende Typzuweisung über Aliase.

Außerdem bietet Crystal von Haus aus Null-Safety: Standardmäßig dürfen Variablen unabhängig vom Typ nicht den Wert Nil haben, und der Compiler prüft beim Übersetzen auf Null-Referenzen.

Schließlich hat die Programmiersprache ein Makrosystem für die Metapgrogrammierung. Die Makros können beliebige Knoten innerhalb des abstrakten Syntaxbaums (Abstract Syntax Tree, AST) aufnehmen.

Der Splat-Operator dient wie in Ruby oder auch PHP zur Angabe einer im Vorfeld nicht bekannten Zahl von Parametern. In der Crystal-Dokumentation dient als Beispiel eine Methode

def sum(*elements)

die eine beliebige Anzahl von Parametern addiert. Intern wandelt die Programmiersprache die Parameter zu einem Tupel um. Umgekehrt lässt sich ein Tupel durch den Splat-Operator direkt an eine Methode übergeben, wobei die einzelnen Tupel-Elemente als Methodenparameter dienen.

Im aktuellen Release erweitert Crystal den Einsatz auf Enumerable Literals und Typdefinitionen, wie folgende Beispiele aus dem Crystal-Blog zeigen:

t1 = {1, 'a'}
t2 = {true, *t1} # => {true, 1, 'a'}

def f1(x : {Bool, *{Int32, Char}}); end       
def f2(x : Tuple(Bool, *{Int32, Char})); end

ae = 'a'..'e'
ccae = ['<', *ae, '>'] # => ['<', 'a', 'b', 'c', 'd', 'e', '>']

Eine weitere syntaktische Neuerung ist, dass der Typ eines while-Ausdrucks der Union aller darin enthaltenen break-Anweisungen plus Nil entspricht.

Bei den Makros finden sich ebenfalls zwei Neuerungen im aktuellen Release. Zum einen haben sie nun Zugriff auf das Top-Level-Modul, um beispielsweise das Vorhandensein einer dort definierten Konstante abzufragen:

{{@top_level.has_constant?("FOO")}}

Zum anderen lässt sich über to_number aus der Makroklasse NumberLiteral die Zahl ohne Typ-Suffix abrufen:

{{ p 10_u8.id }}  # => 10_u8
{{ p 10_u8.to_number }}  # => 10

Schließlich bringt Crystal 1.1 einige Anpassungen in diversen Bereichen der Standard-Library mit, darunter die Methoden #positive? und #negative? für Number und Time::Span.

Weitere Details lassen sich dem Crystal-Blog entnehmen. Die Installationsseite bietet zahlreiche Optionen für diverse Linux-Distributionen und macOS. Nach wie vor ist das Windows Subsystem for Linux der einzige Weg, die Sprache unter Microsofts Betriebssystem zu verwenden, aber laut Blogeintrag schreiten die Arbeiten an einer nativen Windows-Implementierung voran.

(rme)