次の方法で共有


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 との下位互換性が維持されます。