다음을 통해 공유


GDL 값 매크로

값 매크로는 값의 전체 또는 일부를 나타내는 데 사용됩니다. *매크로 구문 내에서 정의됩니다. 하나의 구문 내에서 여러 매크로를 정의할 수 있습니다.

*매크로 구문 내의 각 항목은 별도의 매크로입니다. 항목의 키워드(keyword) 값 매크로의 이름이 되고 항목의 값은 해당 값 매크로의 내용이 됩니다. 매크로 이름은 기호 이름 형식이어야 합니다. 값 매크로의 내용은 값에 대한 유효한 GDL 구문을 준수하는 모든 항목일 수 있습니다.

값 매크로는 다른 값 매크로를 참조할 수 있습니다. *Macros 구문의 instance 이름 뒤에 괄호로 묶인 형식 인수 목록이 오는 태그를 포함할 수 있습니다. *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이 아닙니다.