Süßwaren für JavaScript-Entwickler
Kommentare

Verfeinern von Makros mittels Pattern-Klassen
Auch wenn das Makro aus dem gegebenen Beispiel funktioniert, so ist es dennoch etwas ungenau. Das Pattern $name trifft zunächst einmal auf jedes korrekte

Verfeinern von Makros mittels Pattern-Klassen

Auch wenn das Makro aus dem gegebenen Beispiel funktioniert, so ist es dennoch etwas ungenau. Das Pattern $name trifft zunächst einmal auf jedes korrekte JavaScript-Token zu – also z. B. auch auf eine Zeichenkette, wie „Hello World„. Da es sich hierbei allerdings nicht um einen validen Funktionsnamen handelt, wird die weitere Verarbeitung abgebrochen, da ansonsten invalides JavaScript erzeugt würde. Durch so genannte Pattern-Klassen ist es möglich, Sweet.js mitzuteilen, welche Art von Token das Makro genau erwartet. Für das hier skizzierte Beispiel wäre dies ein gültiger Bezeichner. Pattern-Klassen werden direkt hinter dem Namen des Pattern angegeben, wobei ein Doppelpunkt als Trennzeichen verwendet wird. Listing 5 zeigt eine erweiterte Version des def-Makros, das nun Pattern-Klassen verwendet.

Listing 5
macro def {
    case $name:ident $params $body => {
        function $name $params $body
    }
}

Eine komplette Liste aller Pattern-Klassen findet sich im Wiki von Sweet.js [6]. Die beiden wichtigsten, immer wieder vorkommenden, sind ident für Bezeichner (Identifier) und expr für Ausdrücke (Expressions).

Ein naheliegendes Beispiel aus der echten Welt

Da das Grundkonzept von Makros und Sweet.js nun bekannt ist, scheint es angebracht, sich einem etwas näher an der Realität liegenden Beispiel zu widmen. Wie bereits am Anfang des Artikels erwähnt, ist einer der großen Streitpunkte JavaScripts der Umgang mit Objektorientierung. Das Problem der meisten Entwickler ist hierbei nicht das prototypische Konzept, sondern die teils sehr seltsame und gewöhnungsbedürftige Syntax, mit der dies umgesetzt wird. Diesem Problem soll mittels Makros nun Abhilfe geschaffen werden, um eine Definition von Prototypen durch eine Syntax zu erlauben, wie sie in Listing 6 gezeigt wird.

Listing 6
class Greeter {
    constructor(name) {
        this.name = name
    }

    greet() {
        console.log("Hello " + this.name + "!");
    }

    getName() {
        return this.name;
    }
}

var world = new Greeter("World");
world.greet();

Klassen bzw. Prototypen sollen demnach mit dem Schlüsselwort class definiert werden. Ein Constructor wird durch das Schlüsselwort constructor spezifiziert. Außerdem soll eine beliebige Anzahl weiterer Methoden durch schlichte Angabe ihres Namens und ihrer Parameter möglich sein.

Schnell ist der Name des neuen Makros ersichtlich: class. Denn schließlich soll innerhalb dieses Blocks die ganze Magie stattfinden:

macro class {
  case $className:ident { /* ... */ } => {}
}

Als Erstes muss nun der Name der Klasse extrahiert werden, da dieser für die weitere Erstellung benötigt wird:

macro class {
  case $className:ident { /* ... */ } => {}
}

Der Klassenname selbst muss ein gültiger Bezeichner sein, daher wird hierfür die Pattern-Klasse ident herangezogen. Gefolgt wird der Klassenname von einem Block, der durch geschweifte Klammern gekennzeichnet wird. Transformiert wird das Ganze derzeit noch in nichts, da noch nicht alle Komponenten zur Verfügung stehen.

Was genau steht also innerhalb der geschweiften Klammern? Zunächst einmal das Schlüsselwort constructor, gefolgt von einer Reihe von Pattern, die sehr vertraut wirken. Es sind die gleichen, die bereits aus dem def-Beispiel bekannt sind:

macro class {
  case $className:ident {
    constructor $constructorParams $constructorBody
  } => {}
}

Noch ist das Makro allerdings nicht fertig, denn es fehlt noch die Möglichkeit, Methoden der Klasse anzugeben. Auch hier ist die Syntax wieder sehr ähnlich, denn schließlich sehen Methoden auch nicht anders aus, als der Constructor selbst – mit dem einzigen Unterschied, dass der Methodenname nicht feststeht, sondern ebenfalls ein Pattern ist:


Themen der letzten Seite:

  • 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 -