Input Control

m4wrap

m4wrap ( String . . . )

m4wrap 은 맨 나중에 그러니까 모든 입력이 처리되고 divert 된 내용도 출력이 된 후에 마지막에 String 을 출력할 수 있게 해줍니다. m4wrap 에 의해 출력되는 String 에 대해서는 매크로 확장이 발생합니다. 매크로 이름을 이용해 syscmd 도 실행할 수 있으므로 일종의 cleanup actions 을 위해 사용할 수 있습니다. m4wrap 이 여러 번 사용될 경우에는 stack 순서에 따라 마지막 m4wrap 이 제일 먼저 출력됩니다. 이때 한 가지 주의할 점은 m4wrap 출력들 사이에는 공백 없이 단어가 붙게 됩니다. 아래 첫 번째 예제를 보면 zoo 매크로가 XXX 로 정의되어 있지만 m4wrap 출력은 zoofoo 가 되어 확장이 발생하지 않고 있습니다. 따라서 m4wrap 스트링을 정의할 때는 두 번째 와 같이 마지막에 `' 를 추가해 주어야 합니다.

$ m4 <<\@                                   $ m4 <<\@                      
define(`zoo', `XXX')                        define(`zoo', `XXX')
11111111                                    11111111
m4wrap(`foo', `bar', `baz')dnl              m4wrap(`foo', `bar', `baz')dnl
divert(1)dnl                                divert(1)dnl
m4wrap(`zoo')dnl                            m4wrap(`zoo`'')dnl    # `' 를 추가
22222222                                    22222222
@                                           @

11111111                                    11111111
22222222         # zoofoo 가 되어             22222222
zoofoo bar baz   # 확장이 발생하지 않는다.       XXXfoo bar baz   # zoo 가 XXX 로 확장된다.

다음은 m4wrap 을 이용해 본문 중에 사용된 임시파일을 삭제하는 예입니다.

$ m4 <<\@                               
define(`file1', mkstemp(`/tmp/foo-XXXXXX'))dnl
define(`cleanup', `syscmd(`rm 'file1)')dnl
m4wrap(`cleanup')dnl
11111111
`file1 : ' file1
22222222
@

11111111
file1 :  /tmp/foo-844SpO
22222222

$ ls /tmp/foo-844SpO       # m4wrap 의 cleanup 매크로 확장에 의해 임시파일이 삭제되었다.
ls: cannot access '/tmp/foo-844SpO': No such file or directory
$ m4 <<\@                               
define(`aa', `AA
')dnl
m4wrap(`a')m4wrap(`a')   
@

AA
---------------------

$ m4 <<\@                                        
define(`f', `ifelse(`$1', 0, `Answer: 0!=1       # f(10) 에의해 m4wrap 이 설정되고, 종료시
', eval(`$1>1'), 0, `Answer: $2$1=eval(`$2$1')   # f(decr(`$1'), `$2$1*') 가 실행되면서
', `m4wrap(`f(decr(`$1'), `$2$1*')')')')dnl      # 다시 m4wrap 이 설정되고 ... 반복된다.

f(10)
@

Answer: 10*9*8*7*6*5*4*3*2*1=3628800