GDL マクロ引数
マクロ定義の内容は、その仮引数のすべて、一部を参照することも、まったく参照しないこともできます。特に値マクロ定義の場合、複数の値マクロ定義が、すべてのマクロで共有される単一の仮引数リストを持つ 1 つの *Macros 構造内に存在する可能性があります。 定義。 この場合、1 つの定義で仮引数の一部を参照でき、別の定義は何も参照しません。
マクロ定義で 1 つ以上の仮引数への参照が省略されている場合、マクロの参照時に提供されるパラメーター リストでは、何も区切られていないコンマ (,) によって欠落しているパラメーターを示すことができます。
たとえば、次のマクロ参照では、5 番目の引数のみが使用されます。 最初の 4 つは省略されます。
*Attribute: =Macro(,,,, =PassedInMacroRef)
末尾の省略されたパラメーターを指定する必要はありません。 前の例のマクロが 10 個の仮引数を宣言し、5 番目の引数のみを参照した場合でも、前の例はマクロを参照する有効な方法です。
値マクロの場合、マクロ参照とそのパラメーター リストの間に空白は許可されません。 この構文により、パーサーは、引数を使用しないマクロ参照とその後にパラメーター リストのようなものが偶然続くマクロ参照と、パラメーター リストを使用するマクロ参照を区別できるようになります。
たとえば、次のコード例を考えてみます。
*Attrib: =Macro1 (=Macro2) *% is 2 separate macro references
while
*Attrib: =Macro1(=Macro2) *% you are passing Macro2 as a
*% parameter to Macro1.
マクロ定義が入れ子になっている場合、仮引数は、引数を宣言したマクロの内容でのみ使用できます。 入れ子になったマクロ定義の内容は、外側のマクロで定義されている引数を参照できません。
マクロ定義内で発生するマクロ参照には、それ自体がパラメーター リストを必要とするマクロに名前を付けるパラメーター リストを含めることができます。 ただし、仮引数への参照にパラメーター リストを指定することはできません。 たとえば、ブロック マクロ定義内の次のエントリを使用できます。
*Attrib1: =Macro1(=Macro2(=Macro3(=Arg1, =Arg2)))
前の例では、=MacroN は以前に定義された値マクロへの参照を表し、=ArgN は仮引数への参照を表します。
ただし、次のコード例は許容されるエントリではありません。
*Attrib2: =Arg1(=Arg2, =Arg3(=Macro1, =Macro2)) *% Not Valid !
マクロ参照が、そのマクロが宣言する仮引数名と一致する場合、その名前を持つ実際のマクロが存在するかどうかに関係なく、それがその仮引数への参照であるとみなすことができます。 マクロ参照で名前空間修飾子を使用することで、このようなあいまいさを回避できます。 ただし、仮引数で名前空間修飾子を使用することはできません。
値マクロの場合、*Macros 構造内で仮引数リストが宣言されていない場合は、その中で定義されているマクロへの参照の後にパラメーターの一覧を続けるべきではありません。 このような一覧は、マクロ参照の一部とは見なされません。
たとえば、次のコード例で =Macro1 が定義されているかどうかを考えてみます。
*Macros: NoArgList
{
Macro1: "a Value macro with no argument list"
Macro2: "a Value macro with no argument list"
Macro3: "a Value macro with no argument list"
}
次に、次のマクロ参照は、3 つの別々の無関係なマクロ参照として解釈されます。
*attribute: =Macro1(=Macro2, =Macro3)
パーサーは、(=Macro2,=Macro3) を =Macro1 のパラメーターの一覧として解釈しません。 この動作により、現在の GPD との下位互換性が維持されます。