[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3. 매크로 사용하기

이 장은 매크로의 기본적인 사용법과 매크로에서 인자를 넘겨주는 방법, 매크로가 어떻게 취급되는지를 설명한다.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.1 매크로의 기본적인 사용방법

매크로를 부를 때는 아래와 같이 한다.

 
name

이것은 아무런 인자도 없이 매크로를 부르는 것이다. 또는 다음과 같이 한다.

 
name(arg1, arg2, ..., argn)

이것은 n개의 인자로 매크로를 부르는 것이다. 매크로의 인자의 수에는 제한이 없다. 모든 인자는 문자열이다. 그러나 다른 매크로는 인자를 다르게 해석할 수 있다.

반드시 왼쪽 괄호는 name 다음에 공백없이 바로 나와야 한다. 그렇지 않으면 매크로는 하나의 인자도 없는 채 호출된다.

매크로를 하나도 없는 채 호출을 한다면, 반드시 괄호는 없어야 한다. 다음 매크로 호출

 
name()

는 하나의 인자를 가진다. 그것은 빈 문자열이다.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.2 매크로 호출을 억제하기

m4이 그 조상들보다 (예를 들어, Stratchey의 GPM과 같은) 뛰어난 점중 한가지는 매크로로 확장한 것을 다시 확장한다는 것이다. 이것은 어떤 호출을 의미하는 접두어 같은 것이 없이도, 특별한 재정렬이 없이도 다시 매크로를 인식한다는 점이다. 이것은 유용한 반면 문제의 원천이 되기도 한 다. 원치 않는 매크로를 호출할 수 도 있다는 것이다. 따라서 GNU m4는 명칭을 원치 않는 매크로로 인식하는 것을 억제하는 여러 가지의 매카니즘과 테크닉을 제공한다.

그 첫 번째로, 많은 내장 매크로들은 인자가 없이는 호출할 수 없다. 이러한 매 크로들은 명칭 다음에 여는 괄호가 바로 따라오지 않는다면 내장 매크로는 호출 되지 않는다. 이것은 거의 대부분의 경우에 문제의 해결책이 된다. ‘include’나 ‘eval’같은 경우가 대표적인 예이다. 이 문서의 후반부에 “이 매크로는 인자가 있 을 때에만 인식된다”는 참고성 발언을 종종 볼 것이다.

이러한 작업을 도와주는 명령행 호출 옵션(--prefix-builtins, 또는 -P)이 있다. 이것은 내장 매크로를 호출할 때 ’m4_’를 앞에 붙이도록 하는 것이다. 이 옵션은 사용자 매크로에는 전혀 영향을 미치지 않는다. 예를 들면 m4_dnlm4_m4exit 과 같이 적어야 한다는 이야기다.

독자가 가지고 있는 GNU m4changeword 기능을 가지고 있다면, 이것은 내장매크로와 사용자 정의 매크 로에 공히 매크로 명칭의 문법에 더많은 유연성을 제공한다. 이러한 시험적인 특징에 대해 자세히 알고 싶으면 See section 단어의 어휘 구조 바꾸기.

물론, 하나의 명칭을 존재하는 매크로로 호출하는 것으로 해석하는 것을 억제 하는 가장 간단한 방법은 그것을 따옴표로 묶어 버리는 것이다. 이 장의 후반부 에서 좀 더 깊게 매크로 호출의 영향을 차단하는 방법과 매크로 호출을 억제하는 데 사용되는 인용구로 묶는 방법을 설명한다.

따옴표로 묶는 것이 보통 매크로 전체 명칭이 될 수도 있지만, 명칭의 일부분 이 될 수도 있다. 빈 문자열을 따옴표로 처리하는 것도 가능하다. 그러나 이것은 명칭의 내부에서만 작동한다. 예를 들면,

 
`divert'
`d'ivert
di`ver't
div`'ert

모두다 문자열 ‘divert’를 의미한다. 다음의 두 개는,

 
`'divert
divert`'

내장 매크로 divert를 호출할 것이다.

매크로 확장은 다시 재검색된다. 다음의 예는 문자열 ‘de’필드가 될 것이다. 정확하게 이야기하자면 m4는 입력으로 ‘substr(abcde, 3, 2)’를 취할 것이다.

 
define(`x', `substr(ab')
define(`y', `cde, 3, 2)')
x`'y

따옴표 처리된 문자열의 한쪽에 따옴표가 없는 문자열이 있다면 그것은 매크로 명칭으로 인식할 것이다. 아래의 예에서 따옴표안의 빈 문자열은 dnl 매크로를 인 식하도록 허용한다.

 
define(`macro', `di$1')
macro(v)`'dnl

따옴표가 없다면, 문자열 ‘divdnl’이 될 것이다.

따옴표 처리는 문자들 주위로 묶음으로서 연쇄적인 매크로 확장을 억제할 수 있다. 다음은 그예이다.

 
define(`macro', `di$1')
macro(v)`ert'

입력은 문자열 divert를 생성할 것이다. 따옴표가 없다면 divert라는 내장 매 크로가 호출된다.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.3 매크로의 인자들

어떤 것이 하나의 명칭이라면 그것은 거의 대부분 매크로 정의이다. 그것은 다시 매크로로 확장된다.

명칭뒤에 여는 괄호가 따라오면, 인자는 매크로를 호출하기 전에 취해진다. 정 해진 것보다 적은 수의 인자가 나온다면 나머지 인자는 빈 문자열로 대치되고, 정해진 것보다 많은 수의 인자가 나온다면 나머지 인자는 무시된다.

보통 m4는 내장 매크로를 호출할 때 적합하지 않는 수의 인자를 가진다면 경고를 내보낸다. 이러한 경고는 ‘-Q’ 명령행 옵션으로 잠재울 수 있다. 사용자가 정의한 매크로에서는 주어진 인자의 수를 체크하지 않는다.

매크로는 보통 인자를 수집할 동안 확장되고, 확장된 텍스트로 나타나는 콤마 나 따옴표(quotes), 괄호는 인자로 곧 잘 사용된다. 그래서 다음의 foo가 ‘, b, c’로 확장된다면,

 
bar(a foo, d)

이 매크로는 4개의 인자를 가질 것이다. 그것은 ‘a’, ‘b’, ‘c’, ‘d’가 된다. 첫번째 인자가 공백을 포함하게 되는 이유를 이해하자면 따옴표가 없는 공백문자는 결코 인자의 일부분이 아니라는 것을 기억하자.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.4 매크로의 인자를 따옴표로 묶기

각각의 인자는 따옴표로 묶이지 않은 제거된 공백문자를 가진다. 각각의 인자 에서 모든 묶여지지 않은 괄호는 한쌍으로 되어야 한다. 예를 들면, foo는 매크로이 다.

 
foo(() (`(') `(')

이것은 하나의 인자를 가지는 매크로를 호출한다. 그값은 ‘() (() (’이다.

매크로에서 모든 인자를 따옴표로 묶는 것은 공통적인 습관이다. 인자가 확장 되기를 바라지 않는 한 그렇다. 그래서, 위의 괄호의 예에서는 바른 방법은 다음 과 같이 하는 것이다.

 
foo(`() (() (')

어떤 인자에서는 따옴표가 없어야 할 경우도 있다. 그런 경우에 각각의 인자에 따옴표를 붙이지 않는다고 해서 틀린 것은 아니다. 다만 그것은 반드시 조심하지 않으면 안될 안좋은 습관일 뿐이다.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.5 매크로의 확장

매크로에서 인자가 수집될 때 , 매크로는 확장된다. 그리고 확장된 텍스트는 다시 입력으로 넣어져서 읽어들인다. 따라서 하나의 매크로 호출에서 확장된 텍스트는 그 안에 또다른 매크로 호출이 포함되어 있다면 더 많은 매크로를 호출할 수 있다. 이 경우에 다시 첫 매크로 호출이 확장된다.

간단한 예를 하나 들면, 아래의 foo는 ‘bar’로 확장되고, bar는 ‘Hello World’로 확장된다고 가정하면

 
foo

는 먼저 ‘bar’로 확장되고, 다시 읽혀져서 ‘Hello World’로 확장된다.


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Autobuild on October 25, 2015 using texi2html 1.82.