Kommentare

Vorbereitungen für den Einsatz
Sweet.js erfordert für einen statischen Compile-Vorgang eine Installation von Node.js [5]. Hiermit können Makros bequem auf der Kommandozeile angewendet werden. Das Ergebnis

Vorbereitungen für den Einsatz

Sweet.js erfordert für einen statischen Compile-Vorgang eine Installation von Node.js [5]. Hiermit können Makros bequem auf der Kommandozeile angewendet werden. Das Ergebnis ist normaler JavaScript-Code, der in allen üblichen Browsern und Engines zur Ausführung gebracht werden kann. Es ist außerdem ebenfalls möglich, Sweet.js-Makros direkt im Browser auswerten zu lassen. Da es zum Entwickeln angenehmer ist, die Ausgaben direkt auf dem eigenen System vorliegen zu haben, fällt die Entscheidung hier auf Node.js.

Nachdem Node.js installiert ist, steht automatisch auch das Kommando npm zur Verfügung, das die Installation von JavaScript-Paketen erlaubt. Durch einen einfachen Aufruf kann nun Sweet.js installiert und eingerichtet werden:

npm install -g sweet.js

Nach der erfolgreichen Ausführung dieser Installation steht der Sweet.js-Makro-Expander unter dem Namen sjs bereit. Die gelesene Eingangssprache ist JavaScript mit der einzigen Ausnahme des Schlüsselworts macro, das nun für die Definition von Makros verwendet werden kann.

Anwendung ohne Makro

Da es sich bei der von sjs eingesetzten Sprache um JavaScript handelt, kann natürlich auch JavaScript-Code als Eingabe dienen, der keinerlei Makros enthält. Speichert man die in Listing 1 (alle Listings finden Sie auch auf github.com ) gezeigte Funktion in einer Datei namens simple_function.js ab und ruft anschließend sjs auf dieser Datei auf, so sieht man dennoch einige Unterschiede zum Original:

sjs simple_function.js

Das Ergebnis der Transformation ist in Listing 2 zu sehen. Es ist schnell ersichtlich, dass sich an der Funktionalität des Quelltexts nichts geändert hat. Jedoch wurden die Variablennamen augenscheinlich verändert. Sie besitzen nun alle ein angefügtes Dollarzeichen, gefolgt von einer Zahl. Hierbei handelt es sich um die Methode, die Sweet.js einsetzt, um versehentliche Variablenüberschattungen durch Makros auszuschließen. Stören muss einen diese Veränderung nicht, da der generierte Quelltext immer noch korrekt seinen Dienst verrichtet.

Listing 1
function doSomething(paramA$0, paramB$1) {
    console.log(paramA$0, paramB$1);
}
doSomething('Hello', 'World');
Ein erstes Makro

Sweet.js ist installiert und funktioniert so weit wie gewünscht. Es wird demnach Zeit, ein erstes Makro zu erstellen: Es wäre doch schön, wenn für die Definition von Funktionen nicht immer die komplette Zeichenkettefunction ausgeschrieben werden müsste. Ein wie aus anderen Sprachen bekanntes def wäre eine mögliche Alternative. Das folgende Makro erlaubt die Definition von Funktionen, wie sie in Listing 3 gezeigt wird:

macro def {
  case $name $params $body => {
    function $name $params $body
  }
}
Listing 3
def hello(name) {
    console.log("Hello " + name + "!");
}

Ein Makro besitzt immer den gleichen Aufbau: Zunächst wird das macro-Schlüsselwort verwendet, um eindeutig zu kennzeichnen, dass es sich bei dem nun folgenden um ein Sweet.js-Makro handelt. Auf dieses Schlüsselwort folgt immer ein Bezeichner, der das Makro benennt. Dieser Bezeichner referenziert das Makro ebenfalls für Aufrufe innerhalb des JavaScript-Codes. In diesem Beispiel wurde der Bezeichner, wie zuvor angedeutet, def genannt. Nach dem Schlüsselwort macro, gefolgt von dem gewünschten Bezeichner, beginnt immer ein neuer Block, der durch geschweifte Klammern gekennzeichnet wird. Innerhalb dieses Blocks kann eine beliebige Anzahl an case-Einträgen existieren. Diese beschreiben, wie der durch das Makro zu verarbeitende Code auszusehen hat. In diesem Beispiel wird der Name der Funktion ($name), eine Liste mit Parametern ($params) sowie der Funktionsrumpf ($body) nach dem def-Schlüsselwort erwartet. Die Benennung der Makrovariablen bleibt dem Autor des Makros vollkommen freigestellt. Es existieren keine Namensregeln, die es einzuhalten gilt.

Der Beschreibung der erwarteten Syntax folgt ein Doppelpfeil (=>) mit einem anschließenden neuen Block. Innerhalb dieses Blocks wird das gewünschte Ergebnis des Makros beschrieben. Im Fall dieses Beispiels demnach das Schlüsselwort function, gefolgt von dem Funktionsnamen, der Parameterliste und dem Funktionsrumpf. Alle zuvor eingesetzten Variablen können für die Erzeugung des Ergebnisses wiederverwendet werden. Listing 4 zeigt das Ergebnis, nachdem Listing 3 durch das hier beschriebene Makro verarbeitet wurde.

Listing 4
function hello(name$1) {
    console.log('Hello ' + name$1 + '!');
}

Themen der folgenden Seiten:

  • Verfeinern von Makros mittels Pattern-Klassen
  • Ein naheliegendes Beispiel aus der echten Welt
  • Wiederholungen in Makros
  • Lesbarer durch Makros
  • Liegt hier die Zukunft?
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -