GDL 値マクロ
値マクロは、値のすべてまたは一部を表すために使用されます。 これらは *Macros コンストラクト内で定義されます。 1 つのコンストラクト内で複数のマクロを定義できます。
*Macros コンストラクト内の各エントリは個別のマクロです。 エントリのキーワードが値マクロの名前になり、エントリの値がその値マクロの内容になります。 マクロ名はシンボル名の種類である必要があります。 値マクロの内容は、値の有効な GDL 構文に準拠する任意の値にすることができます。
値マクロは、他の値マクロを参照できます。 *Macros 構造のインスタンス名には、タグの後に括弧で囲まれた仮引数リストを含めることができます。 *Macros 構造内のマクロ定義による仮引数への参照は、値マクロが実際に参照されるときに渡される対応するパラメーターによって記号的に置き換えられます。
注 値マクロ参照を渡すために使用される引数の宣言と参照には、引数の型が値マクロであることを示す等号 (=) が接頭辞として付けられます。 値マクロへのすべての参照には、ブロック マクロではなく値マクロへの参照であることを示す等号 (=) が接頭辞として付けられます。 等号の直後に値マクロ名を続ける必要があり、間に空白を入れることはできません。 値マクロへの参照では、パラメーター リストを任意の深さに入れ子にすることができます。
マクロの例
すべての値マクロ定義は、完全で有効な値エンティティとして認識される必要があります。
次のコード例は、値マクロの使用方法を示しています。
*Macros:
{
InvalidMacro: "First Half of a string
}
引用符で囲まれた文字列コンテキストは二重引用符で終了する必要があるため、InvalidMacro は無効です。 この終端化されていない文字列は完全な値ではありません。
不完全な値エンティティを表す場合は、次のコード例を使用します。
*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."
次のコードは、マクロ引数の使用方法を示しています。
*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.
}
次のコードは、パラメーターでマクロ参照を使用する方法を示しています。
*BadOutput: =String1(=result1)
*GoodOutput: =String1(=adverb1(=adverb1(=result2, =result3), =adverb2(=result5)))
パーサーは、上記のマクロ参照を展開して、次のコードを生成します。
*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.
値マクロ参照は、すべての値コンテキストで認識されるわけではありません。 たとえば、値マクロは、任意の値または引用符で囲まれた文字列コンテキスト内では認識されません。 ただし、値マクロは、引用符で囲まれた文字列コンテキスト内に存在する可能性がある 16 進文字列コンテキスト内で認識されます。
GPD との下位互換性を提供するために、パーセント記号 (%) が値マクロ定義の内容内の非リテラル空白値コンテキストで使用される場合、パーセント記号 (%) はコマンド パラメーター コンテキストを導入することを意味すると解釈されます。 つまり、コマンド パラメーターを定義する場合、またはパーセント記号が <Begin/EndValue> などのリテラル空白コンテキスト内に含まれている場合を除き、値マクロ定義内でパーセント記号を使用しないでください。
マクロ定義の内容は、マクロがマクロ定義の外部で参照された場合にのみ実際に解釈されます。 このとき、参照されているマクロがその内容に置き換えられ、実際にその内容が解釈されます。 内容にマクロ参照が含まれている場合、その参照はその内容で置き換えられ、そのマクロの内容で解釈が続行されます。
パーサーは単一の入力ストリームに対して動作すると考える必要があります。 マクロ定義の外側でマクロ参照が検出された場合、そのマクロ参照は入力ストリームから削除され、その内容に置き換えられ、入力ストリームの解析がマクロの内容で続行されます。
次のマクロを考えてみましょう。
*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
上記のマクロは、次のコードに展開されます。
*Print1: "
*Print2: " This is enclosed
*Print3: by quotes."
*Print4: " This is enclosed <not a hex string!> by quotes."
展開された結果は構文的に正しい GDL ではないことに注意してください。