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