typisierte vs untypisierte vs expr vs stmt in Vorlagen und Makros

8

Ich habe in letzter Zeit Vorlagen und Makros verwendet, aber ich muss sagen, dass ich kaum Informationen über diese wichtigen Typen gefunden habe. Das ist mein oberflächliches Verständnis:

  • typed / expr ist etwas, das vorher existieren muss, aber Sie können .immediate verwenden. um sie zu überwinden.
  • untyped / stmt ist etwas, das vorher nicht definiert wurde / eine oder mehrere Anweisungen.

Dies ist eine sehr vage Vorstellung von den Typen. Ich hätte gerne eine bessere Erklärung von ihnen, einschließlich der Typen, die als Rückgabe verwendet werden sollten.

    
Arrrrrrr 12.07.2015, 11:32
quelle

1 Antwort

10

Das Ziel dieser verschiedenen Parametertypen besteht darin, Ihnen mehrere zunehmende Genauigkeitsgrade zu geben, um festzulegen, was der Compiler als Parameter für das Makro akzeptieren soll.

Stellen wir uns ein hypothetisches Makro vor, das mathematische Gleichungen lösen kann. Es wird so verwendet:

%Vor%

Hier kümmert sich das Makro nur um die Struktur des gelieferten AST-Baumes. Es ist nicht erforderlich, dass derselbe Baum im aktuellen Bereich ein gültiger Ausdruck ist (d. H. Dass x definiert ist usw.). Das Makro nutzt nur den Vorteil des Nim-Parsers, der bereits die meisten mathematischen Gleichungen decodieren kann, um sie in leichter zu handhabende AST-Bäume umzuwandeln. Dafür sind untyped -Parameter zuständig. Sie werden nicht semantisch überprüft und Sie erhalten die rohe AST.

Auf dem nächsten Schritt in der Präzisionsleiter sind die Parameter typed . Sie erlauben uns, eine generische Art von Makro zu schreiben, die einen beliebigen Ausdruck akzeptiert, solange es im aktuellen Bereich eine korrekte Bedeutung hat (d. H. Sein Typ kann bestimmt werden). Abgesehen davon, dass Fehler früher abgefangen werden, hat dies auch den Vorteil, dass wir jetzt mit dem Typ des Ausdrucks innerhalb des Makro-Körpers arbeiten können (mit macros.getType proc).

Wir können noch präziser werden, indem wir einen Ausdruck eines bestimmten Typs (entweder eines konkreten Typs oder einer Typklasse / eines Typkonzepts) benötigen. Das Makro wird nun in der Lage sein, an der Überladungsauflösung teilzunehmen, wie bei einem normalen Prozess. Es ist wichtig zu verstehen, dass das Makro weiterhin einen AST-Baum erhält, da es sowohl Ausdrücke akzeptiert, die zur Kompilierzeit ausgewertet werden können, als auch Ausdrücke, die nur zur Laufzeit ausgewertet werden können.

Schließlich können wir verlangen, dass das Makro einen Wert eines bestimmten Typs empfängt, der zur Kompilierungszeit geliefert wird. Das Makro kann mit diesem Wert arbeiten, um die Codegenerierung zu parametrisieren. Dies ist ein Bereich der statischen Parameter . Sie sind im Körper des Makros keine AST-Bäume mehr, sondern eher gut typisierte Werte.

Bis jetzt haben wir nur über Ausdrücke gesprochen, aber Nims Makros akzeptieren und erzeugen auch Blöcke und dies ist die zweite Achse, die wir kontrollieren können. expr bedeutet im Allgemeinen einen einzelnen Ausdruck, während stmt eine Liste von Ausdrücken bezeichnet (in der Vergangenheit stammt der Name von StatementList, das als separates Konzept existierte, bevor Ausdrücke und Anweisungen in Nim vereinheitlicht wurden).

Die Unterscheidung wird am einfachsten mit den Rückgabetypen von Vorlagen veranschaulicht. Berücksichtigen Sie die newException Vorlage aus dem Systemmodul:

%Vor%

Auch wenn mehrere Schritte erforderlich sind, um eine Ausnahme zu erstellen, indem wir expr als Rückgabetyp der Vorlage angeben, teilen wir dem Compiler mit, dass nur der letzte Ausdruck als Rückgabewert der Vorlage betrachtet wird. Der Rest der Anweisungen wird inline, aber geschickt aus dem aufrufenden Code versteckt.

Als weiteres Beispiel definieren wir einen speziellen Zuweisungsoperator, der die Semantik von C / C ++ emulieren kann und Zuweisungen in if-Anweisungen erlaubt:

%Vor%

Die Angabe eines konkreten Typs hat dieselbe Semantik wie die Verwendung von expr . Wenn wir stattdessen den Rückgabetyp stmt verwendet hätten, hätte der Compiler es uns nicht erlaubt, eine "Liste von Ausdrücken" zu übergeben, weil die if-Anweisung offensichtlich einen einzelnen Ausdruck erwartet.

.immediate. ist ein Vermächtnis aus einer längst vergangenen Zeit, als Vorlagen und Makros nicht an der Überladungsauflösung beteiligt waren. Als wir sie zuerst auf das Typsystem aufmerksam machten, benötigte viel Code die aktuellen untyped -Parameter, aber es war zu schwer, den Compiler neu zu gestalten, um sie von Anfang an einzuführen, und stattdessen fügten wir das Pragma .immediate. hinzu erzwinge das abwärtskompatible Verhalten für das gesamte Makro / Template.

Mit typed/untyped haben Sie eine genauere Kontrolle über die einzelnen Parameter des Makros und das Pragma .immediate. wird schrittweise auslaufen und veraltet sein.

    
zah 12.07.2015, 20:36
quelle

Tags und Links