共用方式為


GDL 值宏

值宏 可用來表示值的所有或部分。 它們定義于 *Macros 建構內。 您可以在一個建構中定義多個宏。

*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.

值宏參考在所有值內容中都無法辨識。 例如,值宏在任意值或引號字串內容內無法辨識。 但值宏可在可能位於引號字串內容內的十六進位字串內容內辨識。

為了提供與 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。