GDL-Wertmakros
Wertmakros werden verwendet, um einen Wert ganz oder teilweise darzustellen. Sie werden innerhalb des *Makros-Konstrukts definiert. Sie können mehrere Makros innerhalb eines Konstrukts definieren.
Jeder Eintrag innerhalb des *Makros-Konstrukts ist ein separates Makro. Der Schlüsselwort (keyword) des Eintrags wird zum Namen des Wertmakros, und der Wert des Eintrags wird zum Inhalt dieses Wertmakros. Der Makroname muss ein Symbolnamenstyp sein. Der Inhalt eines Wertmakros kann alles sein, was der gültigen GDL-Syntax für einen Wert entspricht.
Wertmakros können auf andere Wertmakros verweisen. Der instance Name des *Makros-Konstrukts kann ein Tag enthalten, auf das eine formale Argumentliste mit Klammern folgt. Jeder Verweis auf ein formales Argument durch eine der Makrodefinitionen im *Macros-Konstrukt wird symbolisch durch den entsprechenden Parameter ersetzt, der übergeben wird, wenn tatsächlich auf das Wertmakro verwiesen wird.
Hinweis Den Deklarationen und Verweisen von Argumenten, die zum Übergeben von Wertmakroverweisen verwendet werden, wird das Gleichheitszeichen (=) vorangestellt, um anzugeben, dass der Argumenttyp ein Wertmakro ist. Allen Verweisen auf Wertmakros wird auch das Gleichheitszeichen (=) vorangestellt, um anzugeben, dass der Verweis auf ein Wertmakro anstelle eines Blockmakros verweist. Auf das Gleichheitszeichen muss unmittelbar der Wertmakroname folgen, und es ist kein dazwischen liegendes Leerzeichen zulässig. Verweise auf Wertmakros können Parameterlisten in beliebige Tiefe verschachteln.
Makrobeispiele
Alle Wertmakrodefinitionen müssen als vollständige, gültige Wertentität erkannt werden.
Im folgenden Codebeispiel wird die Verwendung von Wertmakros veranschaulicht.
*Macros:
{
InvalidMacro: "First Half of a string
}
InvalidMacro ist ungültig, da der Zeichenfolgenkontext in Anführungszeichen mit einem doppelten Anführungszeichen beendet werden muss. Diese unterminierte Zeichenfolge ist kein vollständiger Wert.
Wenn Sie eine unvollständige Wertentität darstellen möchten, verwenden Sie das folgende Codebeispiel.
*Macros:
{
FirstHalf: <BeginValue:Q>"This is the first half <EndValue:Q>
SecondHalf: <BeginValue:Q>of the string."<EndValue:Q>
}
*FullString: =FirstHalf=SecondHalf
*% *FullString now expands to generate the complete string:
*FullString: "This is the first half of the string."
Der folgende Code zeigt, wie Makroargumente verwendet werden.
*Macros: FormalArgs(=arg1, =arg2)
{
result1: disappointed
result2: pleased
result3: impressed
result4: awestruck
result5: restrained
adverb1: very =arg1 and =arg2
adverb2: while remaining =arg1
String1: The audience was =arg1 with today's performance.
}
Der folgende Code zeigt, wie Makroverweise mit Parametern verwendet werden.
*BadOutput: =String1(=result1)
*GoodOutput: =String1(=adverb1(=adverb1(=result2, =result3), =adverb2(=result5)))
Der Parser erweitert die vorherigen Makroverweise, um den folgenden Code zu erzeugen.
*BadOutput: The audience was disappointed with today's performance.
*GoodOutput: The audience was very, very pleased and impressed and while remaining restrained with today's performance.
Wertmakroverweise werden nicht in allen Wertkontexten erkannt. Beispielsweise werden Wertmakros innerhalb der Kontexte beliebiger Werte oder Zeichenfolgen in Anführungszeichen nicht erkannt. Wertmakros werden jedoch innerhalb von Hexadik-Zeichenfolgenkontexten erkannt, die sich möglicherweise innerhalb des Zeichenfolgenkontexts in Anführungszeichen befinden.
Um die Abwärtskompatibilität mit GPD zu gewährleisten, wird das Prozentzeichen (%) so interpretiert, dass es einen Befehlsparameterkontext einführt, wenn das Prozentzeichen in einem nicht literalen Leerraumwertkontext innerhalb der Inhalte einer Wertmakrodefinition verwendet wird. Anders ausgedrückt: Vermeiden Sie die Verwendung des Prozentzeichens innerhalb einer Wertmakrodefinition, es sei denn, Sie definieren einen Befehlsparameter oder das Prozentzeichen ist in einem literalen Leerzeichenkontext enthalten, z <. B. Begin/EndValue>.
Der Inhalt einer Makrodefinition wird nur interpretiert, wenn außerhalb einer Makrodefinition auf das Makro verwiesen wird. Zu diesem Zeitpunkt wird das Makro, auf das verwiesen wird, durch seinen Inhalt ersetzt, und der Inhalt wird tatsächlich interpretiert. Wenn der Inhalt einen Makroverweis enthält, wird dieser Verweis durch seinen Inhalt ersetzt, und die Interpretation wird mit dem Inhalt dieses Makros fortgesetzt.
Sie sollten sich vorstellen, dass der Parser auf einen einzelnen Eingabedatenstrom wirkt. Wenn ein Makroverweis außerhalb einer Makrodefinition erkannt wird, wird der Makroverweis aus dem Eingabedatenstrom entfernt und durch seinen Inhalt ersetzt, und die Analyse des Eingabedatenstroms wird mit dem Inhalt des Makros fortgesetzt.
Betrachten Sie das folgende Makro.
*Macros:
{
quote: <BeginValue:x>"<EndValue:x>
first_half: =quote This is enclosed
second_half: by quotes.=quote
whole_string: =first_half <not a hex string!> =second_half
}
*Print1: =quote
*Print2: =first_half
*Print3: =second_half
*Print4: =whole_string
Das vorangehende Makro wird auf den folgenden Code erweitert.
*Print1: "
*Print2: " This is enclosed
*Print3: by quotes."
*Print4: " This is enclosed <not a hex string!> by quotes."
Beachten Sie, dass das erweiterte Ergebnis keine syntaktisch legale GDL ist.