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

9. 출력을 전환하기, 원래대로 놓기

전환(Diversion)은 임시로 출력을 저장할 수 있는 방법을 제공해 준다. m4 의 출력은 언제던지 임시 파일로 전환될 수 있다. 그리고 출력 스트림으로 다시 끼워 넣을 수 있다. 나중에 전환을 되돌릴 수도 있다.

번호붙여진 전환은 0에서 위로 헤아려진다. 전환 번호 0은 보통의 출력 스트림 이다. 동시에 존재하는 전환 번호는 그것을 기술하는 데 사용되는 메모리에 의해 제한된다. 그렇기 때문에 GNU m4 는 전환을 메모리에 유지하려고 한다. 그러나 전체적으로 모든 전환들을 다루기에 적당한 메모리 양으로 제한이 되어 있다 (현 재는 512K). 최대치가 넘어갈 때에는 임시파일이 열려서 가장 큰 전환을 메모리 에서 받는다. 다른 전환을 위애 그 메모리는 자유롭게 된다. 그래서 이것은 이론 상으로 전환의 개수는 사용 가능한 파일 기술자의 숫자에 의해 제한이 된다.


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

9.1 출력을 전환하기

divert를 사용하여 전환할 수 있다.

 
divert(opt number)

number은 전환하는 데 사용되는 번호이다. 만일 number가 없다면 0으로 가정된다.

divert는 확장되지 않는다.

m4의 모든 입력이 처리될 때, 모든 존재하는 전환들은 자동적으로 번호순서대로 원래데로 돌아온다.

 
divert(1)
This text is diverted.
divert
⇒
This text is not diverted.
⇒This text is not diverted.
^D
⇒
⇒This text is diverted.

여러개의 같은 인자를 가지는 divert의 호출은 이전에 전환된 텍스트에 덮어 쓰지 않는다. 단지 덧붙일 뿐이다.

만일 출력이 존재하지 않는 전환으로 전환된 다면 그것은 간단히 취소된다. 이것은 원치 않는 출력을 나타나지 않게 하는 데 사용될 수 있다. 원치 않는 출력의 공통적인 경우는 매크로 정의때마다 지겹게 따라붙는 뉴라인 문자일 것이다. 여기에 그것을 피하는 방법이 있다.

 
divert(-1)
define(`foo', `Macro `foo'.')
define(`bar', `Macro `bar'.')
divert
⇒

이것은 m4에서의 공통적인 프로그래밍 관습이다.


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

9.2 출력을 원래대로 되돌려 놓기 (Undivering output)

전환된 텍스트는 내장 매크로 undivert를 사용하여 원래데로 돌려놓을 수 있다.

 
undivert(opt number, ...)

되돌려지는 전환은 주어진 순서대로 인자로 주어져야 한다. 인자가 없을 경우 는 전환된 모든 것들이 번호 순서래로 되돌려진다.

undivert의 확장은 없다.

 
divert(1)
This text is diverted.
divert
⇒
This text is not diverted.
⇒This text is not diverted.
undivert(1)
⇒
⇒This text is diverted.
⇒

마지막 두개의 빈 라인에 주의하라. 하나는 undivert로 인해서 나타나는 것이 고 하나의 빈라인은 divert로 인해서 나타나는 것이다. 전환은 종종 이와같이 빈 공백 라인으로 시작된다.

전환된 텍스트가 되돌려 질때에는, 그것은 m4가 다시 읽지는 않는다. 단지 바로 현재의 출력으로 복사할 뿐이다. 그러므로 되돌려진것을 다시 전환하는 것은 에러가 아니다.

전환이 되돌려 진다면, 전환된 텍스트는 취소되고 이것은 더이상 거꾸 로 전환시키는 것은 불가능하다.

 
divert(1)
This text is diverted first.
divert(0)undivert(1)dnl
⇒
⇒This text is diverted first.
undivert(1)
⇒
divert(1)
This text is also diverted but not appended.
divert(0)undivert(1)dnl
⇒
⇒This text is also diverted but not appended.

현재의 전환을 다시 되돌리려는 시도는 조용히 묵살된다.

GNU m4는 파일을 되돌릴 수 있다. 인자로 숫자가 아닌 파일 이름을 주면, 현재의 출력으로 복사되며, 해석되지 않는다. 이것을 보완하는 것이 앞서도 이야기한 내장 매크로 include이다 (see section 파일을 삽입하기). 이 차이점을 설명하기 위해서, 파일 ‘foo’가 단어 ‘bar’를 포함하고 있다고 가정하자.

 
define(`bar', `BAR')
⇒
undivert(`foo')
⇒bar
⇒
include(`foo')
⇒BAR
⇒

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

9.3 전환 숫자 (Diversion numbers)

내장 매크로 divnum이 있다.

 
divnum

이것은 현재의 전환숫자로 확장된다.

 
Initial divnum
⇒Initial 0
divert(1)
Diversion one: divnum
divert(2)
Diversion two: divnum
divert
⇒
^D
⇒
⇒Diversion one: 1
⇒
⇒Diversion two: 2

인자가 없는 마지막 divert 호출은 필요없다. 되돌려진 텍스트는 다른 경우에 그 자신에게로 전환될 것이다.


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

9.4 전환된 텍스트 취소하기

출력이 전환될 때, 전환된 텍스트가 활성화될 필요가 있을 것이다. 입력의 끝이 보일 때 비어 있지 않은 모든 전환된 것을 메인의 출력 스트림으로 가져온다. 이 때 하나의 전환을 취소하는 방법이 필요해진다. 모든 전환된것들을 취 소하고 싶다면, 가장 쉬운 길은 m4에게 ‘divert(-1)’로 입력의 끝을 알리고 바로 다음에 명확하게 ‘undivert’를 해주는 것이다.

 
divert(1)
Diversion one: divnum
divert(2)
Diversion two: divnum
divert(-1)
undivert
^D

아무런 출력도 생성되지 않을 것이다.

해당하는 전환만을 선택하여 클리어하는 것은 야래의 매크로를 사용하면 가능하다.

 
define(`cleardivert',
`pushdef(`_num', divnum)divert(-1)undivert($@)divert(_num)popdef(`_num')')
⇒

이예는 undivert를 호출하는 데, 그 영향은 인자로 주어진 전환을 클리어하게 된다. ( 이 매크로에는 더러운 버그가 하나 있다! 그것은 여러분들이 고쳐보라.)


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

This document was generated by Autobuild on June 15, 2016 using texi2html 1.82.