GDL 值宏
值宏 用于表示值的全部或部分。 它们在 *Macros 构造中定义。 可以在一个构造中定义多个宏。
*Macros 构造中的每个条目都是一个单独的宏。 条目的关键字 (keyword) 将成为值宏的名称,条目的值将成为该值宏的内容。 宏名称必须是符号名称类型。 值宏的内容可以是遵守值的有效 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。