Go to the first, previous, next, last section, table of contents.


ÀÔ·Â Á¦¾î

ÀÌ Àå¿¡¼­´Â m4·ÎÀÇ ÀÔ·ÂÀ» Á¦¾îÇÏ´Â ´Ù¾çÇÑ ³»Àå ¸ÅÅ©·Î¸¦ ¼³¸íÇÏ°Ú´Ù.

ÀԷ¿¡¼­ °ø¹é¹®ÀÚ Á¦°ÅÇϱâ

³»Àå ¸ÅÅ©·ÎÀÎ dnlÀº ¸ðµç ¹®ÀÚ¸¦ Àоîµé¿©¼­ ¾ø¾Ö ¹ö¸®´Âµ¥, ù ¹ø° Áٹٲ޹®ÀÚ¸¦ ¸¸³¯ ¶§±îÁö ±×¸®°í ±× ¹®ÀÚ¸¶Àú Æ÷ÇÔÇÑ ¸ðµÎ¸¦ ¾ø¾Ø´Ù.

dnl

±×¸®°í dnlÀº Á¾Á¾ define°ú ºÙ¿©¼­ ¾²¸ç, ±× ¸ñÀûÀº define È£ÃâÀÇ µÚ¿¡ µû¶ó ³ª¿À´Â ÁÙ¹Ù²Þ ¹®ÀÚ¸¦ Á¦°ÅÇϱâ À§ÇÑ °ÍÀÌ´Ù.

define(`foo', `Macro `foo'.')dnl A very simple macro, indeed.
foo
=>Macro foo.

±× ´ÙÀ½ ÁÙ¹Ù²Þ ¹®ÀÚ°¡ ³ª¿Ã ¶§±îÁö¿Í ±× ÁÙ¹Ù²Þ ¹®ÀÚ¸¦ Æ÷ÇÔÇÑ ¸ðµç ÀÔ·ÂÀÌ (¿ªÀÚÁÖ: Ãâ·Â¿¡¼­´Â) Á¦°ÅµÇ¸ç, ÀÌ°ÍÀº ÁÖ¼®¹®ÀÌ Ãë±ÞµÇ´Â ¹æ½Ä°ú ¹Ý´ëÀÌ´Ù.(see section ÁÖ¼®)

º¸Åë, dnlÀÇ µÚ¿¡´Â ¹Ù·Î ÁٹٲÞÀÌ µÇ°Å³ª ´Ù¸¥ °ø¹é¹®ÀÚ°¡ µû¶ó ³ª¿Â´Ù. GNU m4´Â dnl ¹Ù·Î µÚ¿¡ ¿­¸° °ýÈ£°¡ µû¶ó ¿Â´Ù¸é °æ°í¸¦ ÇÑ´Ù. ÀÌ °æ¿ì¿¡ dnlÀº ¸ðµç ÀÎÀÚµéÀ» ¼öÁýÇÏ¿© ó¸®ÇÏ°Ô µÇ´Âµ¥, ±×·¯±â À§ÇØ Â¦ÀÌ ¸Â´Â ´Ý´Â °ýÈ£¸¦ ã°Ô µÈ´Ù. ÀÌ·± ¼öÁý ÀÛ¾÷À¸·Î ÀÎÇØ ÃÊ·¡µÇ¸®¶ó°í ¿¹»ó °¡´ÉÇÑ ¸ðµç ºÎÀÛ¿ëÀÌ ÀϾ °ÍÀÌ´Ù. dnlÀÇ °á°ú´Â Ãâ·ÂµÇÁö ¾Ê´Â´Ù. ¦ÀÌ ¸Â´Â ´Ý´Â °ýÈ£ ´ÙÀ½ºÎÅÍ ±× ´ÙÀ½ ÁÙ¹Ù²Þ ¹®ÀÚ°¡ ³ª¿Ã ¶§±îÁö¿Í ±× ÁÙ¹Ù²Þ ¹®ÀÚ¸¦ Æ÷ÇÔÇÑ ÀÔ·ÂÀÌ, ±×°÷¿¡ ¹«¾ùÀÌ µé¾î ÀÖµçÁö »ó°ü¾øÀÌ ¿©ÀüÈ÷ »ç¶óÁú °ÍÀÌ´Ù.

ÀÎ¿ë ¹®ÀÚ ¹Ù²Ù±â

µðÆúÆ® Àο빮ÀÚ´Â changequote¸¦ »ç¿ëÇÏ¿© ¹Ù²Ü ¼ö ÀÖ´Ù.

changequote(opt start, opt end)

¿©±â¿¡¼­ start´Â Àο뱸ÀÇ ½ÃÀÛÀ» ¾Ë¸®´Â »õ·Î¿î ±¸ºÐÀÚÀÌ°í end´Â ±× ³¡À» ¾Ë¸®´Â ±¸ºÐÀÚÀÌ´Ù. ÀÎÀÚ¸¦ ¾î´À Çϳª¸¸ ºü¶ß¸°´Ù¸é, ±× ºü¶ß¸° ÀÎÀÚ ´ë½Å µðÆúÆ® ±¸ºÐÀÚµé(` °ú ')ÀÌ »ç¿ëµÈ´Ù.

changequote´Â È®ÀåµÇÁö ¾Ê´Â´Ù.

changequote([, ])
=>
define([foo], [Macro [foo].])
=>
foo
=>Macro foo.

Àο빮ÀÚ·Î Àû´çÇÑ ´ÜÀÏ ±ÛÀÚ°¡ ¾ø´Ù¸é, start¿Í end·Î ¾î¶°ÇÑ ±æÀÌÀÇ ¹®ÀÚ¿­À» »ç¿ëÇصµ µÈ´Ù.

changequote([[, ]])
=>
define([[foo]], [[Macro [[[foo]]].]])
=>
foo
=>Macro [foo].

Àο빮ÀÚ¸¦ ºó ¹®ÀÚ¿­·Î ÁöÁ¤ÇÑ´Ù¸é ÀÎ¿ë ¸ÞÄ«´ÏÁòÀ» »ç¿ëÇÒ ¼ö ¾øÀ¸¸ç, ÅؽºÆ®¸¦ ÀοëÇÒ ¹æ¹ýÀÌ ¾ø¾îÁø´Ù.

define(`foo', `Macro `FOO'.')
=>
changequote(, )
=>
foo
=>Macro `FOO'.
`foo'
=>`Macro `FOO'.'

ÇöÀçÀÇ Àο빮ÀÚ¸¦ changequote·Î º¯°æÇÏ´Â °æ¿ì¸¦ Á¦¿ÜÇÑ´Ù¸é, m4¿¡¼­´Â ¸Â´Â ¦ÀÌ ¾ø´Â ¿ÞÂÊ Àο빮ÀÚ°¡ Æ÷ÇÔµÈ ¹®ÀÚ¿­À» ÀοëÇÒ ¹æ¹ýÀÌ ¾ø´Ù.

Àο빮ÀÚ·Î »ç¿ëÇÒ ¹®ÀÚ¿­Àº ¿µ¹®Àڷεµ `_' (¹ØÁÙ¹®ÀÚ)·Îµµ ½ÃÀÛÇÏ¸é ¾ÈµÇ´Âµ¥, ±× ÀÌÀ¯´Â ÀԷ¿¡¼­ÀÇ ¸íĪ°ú È¥µ¿µÉ °ÍÀ̱⠶§¹®ÀÌ´Ù. ±×·¸°Ô Çعö¸®¸é ÀÎ¿ë ¸ÞÄ«´ÏÁòÀÌ »ç¿ë ºÒ°¡´ÉÇÏ°Ô µÈ´Ù.

ÁÖ¼® ±¸ºÐÀÚ º¯°æÇϱâ

µðÆúÆ® ÁÖ¼® ±¸ºÐÀÚ´Â ³»Àå ¸ÅÅ©·Î changecomÀ» »ç¿ëÇÏ¿© º¯°æÇÒ ¼ö ÀÖ´Ù.

changecom(opt start, opt end)

start´Â »õ·Î¿î ÁÖ¼®-½ÃÀÛ ±¸ºÐÀÚÀÌ°í end´Â ÁÖ¼®-³¡ ±¸ºÐÀÚÀÌ´Ù. À̵é ÀÎÀÚ Áß ¾î´À Çϳª¸¦ ºñ¿ö ³õ´Â´Ù¸é µðÆúÆ® ÁÖ¼® ±¸ºÐÀÚÀÎ #°ú ÁÙ¹Ù²Þ ¹®ÀÚ°¡ ºñ¿ö ³õÀº ÀÎÀÚ ´ë½Å »ç¿ëµÈ´Ù. ÁÖ¼® ±¸ºÐÀÚÀÇ ±æÀÌ¿¡´Â Á¦ÇÑÀÌ ¾ø´Ù.

changecomÀº È®ÀåµÇÁö ¾Ê´Â´Ù.

define(`comment', `COMMENT')
=>
# A normal comment
=># A normal comment
changecom(`/*', `*/')
=>
# Not a comment anymore
=># Not a COMMENT anymore
But: /* this is a comment now */ while this is not a comment
=>But: /* this is a comment now */ while this is not a COMMENT

ÁÖ¼®¹®ÀÌ Ãâ·ÂÀ¸·Î º¹»çµÇ´Â ¹æ½ÄÀ» ÁÖÀÇ ±í°Ô º¸¸é, ¸¶Ä¡ ÀοëµÈ ¹®ÀÚ¿­°ú ¹æ½ÄÀÌ ºñ½ÁÇÑ °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. ¸¸ÀÏ ÁÖ¼®¾ÈÀÇ ÅؽºÆ®°¡ È®ÀåµÇ°Ô ÇÏ°í ½ÍÀ¸¸é ÁÖ¼®-½ÃÀÛ ±¸ºÐÀÚ¸¦ Àο빮ÀÚ·Î µÑ·¯½Î½Ã¿À.

changecomÀ» ¾Æ¹«·± ÀÎÀÚ ¾øÀÌ È£ÃâÇÑ´Ù¸é ÁÖ¼® ¸ÅÄ«´ÏÁòÀº ¿ÏÀüÈ÷ »ç¿ë ºÒ°¡´ÉÇÏ°Ô µÈ´Ù.

define(`comment', `COMMENT')
=>
changecom
=>
# Not a comment anymore
=># Not a COMMENT anymore

´Ü¾îÀÇ ¾îÈÖ ±¸Á¶ ¹Ù²Ù±â

changeword¿Í ±×¿Í ¿¬°üµÈ ±â´ÉµéÀº ½ÃÇèÀûÀÎ °ÍÀÌ´Ù. ÀÌ ±â´ÉÀº GNU m4¸¦ ¼³Ä¡ÇÒ ¶§¿¡ configure ½ºÅ©¸³Æ®¿¡ --enable-changeword ¿É¼ÇÀ» ÁÖ¾úÀ» ¶§¿¡¸¸ »ç¿ë°¡´ÉÇÏ´Ù. ÀÌ ±â´ÉÀº º¯°æµÇ°Å³ª ¸ÖÁö ¾ÊÀº ¹Ì·¡¿¡ ¾ø¾îÁú ¼öµµ ÀÖ´Ù. changeword¿¡ ÀÇÁö ÇÏÁö ¸¶¶ó. ÀÌ°Í¿¡ ´ëÇØ ´ç½ÅÀÌ Á¶¾ðÇÒ ¸»ÀÌ ÀÖ´Ù¸é ¹ö±× º¸°í¸¦ ÇÒ ¶§¿¡ ¿¬¶ôÇÒ °÷À¸·Î º¸³»½Ã¿À.

ÆÄÀÏÀÌ m4¿¡ ÀÇÇؼ­ ó¸®µÉ Àû¿¡ ±×°ÍÀº ÀοëµÈ ¹®ÀÚ¿­, ´Ü¾î(¸ÅÅ©·Î À̸§À¸·Î ÀÎ½ÄµÉ Áöµµ ¸ð¸£´Â °Í), °£´ÜÇÑ ÅäÅ«(±× ¿ÜÀÇ ´ÜÀÏ ¹®ÀÚ)·Î ºÐ¸®µÈ´Ù. ´Ü¾î´Â ´ÙÀ½ÀÇ Á¤±Ô Ç¥Çö½ÄÀ¸·Î Á¤ÀǵȴÙ.

[_a-zA-Z][_a-zA-Z0-9]*

changeword¸¦ »ç¿ëÇÑ´Ù¸é ÀÌ Á¤±Ô Ç¥Çö½ÄÀ» ¹Ù²Ü ¼ö ÀÖ´Ù. m4 ÀÇ ¾îÈÖ ±ÔÄ¢À» ´À½¼ÇÏ°Ô Ç®¾î ³õ´Â °ÍÀÌ À¯¿ëÇÒ ¶§°¡ Àִµ¥ (¿¹¸¦ µé¸é) ¼ýÀÚµé·Î ÀÌ·ç¾îÁø ÆÄÀÏ·Î º¯È¯ÇÏ´Â µ¥¿¡ Àû¿ëÇϱ⸦ ¿øÇÒ ¶§¿Í °°Àº °æ¿ìÀÌ´Ù.

changeword(`[_a-zA-Z0-9]+')
define(1, 0)
=>1

¾îÈÖ±ÔÄ¢À» ºýºýÇÏ°Ô Á¶ÀÌ´Â °ÍÀº ´ú ¾µ¸ð ÀÖ´Â ÆíÀε¥, ±× ÀÌÀ¯´Â ¸¹Àº °æ¿ì¿¡ ³»Àå ¸ÅÅ©·Î Áß ¸î °³¸¦ ¾µ ¼ö ¾øµµ·Ï ¸¸µé¾î ¹ö¸± ¼öµµ Àֱ⠶§¹®ÀÌ´Ù. ¾î¼¸é ¿øÇÏÁö ¾Ê´Â ³»Àå ¸ÅÅ©·Î¸¦ È£ÃâÇÏ´Â °ÍÀ» ¸·´Â µ¥¿¡ ¾µ ¼öµµ ÀÖÀ» Áö ¸ð¸¥´Ù. ¿¹¸¦ µé¸é ´ÙÀ½°ú °°´Ù.

define(`_indir', defn(`indir'))
changeword(`_[_a-zA-Z0-9]*')
esyscmd(foo)
_indir(`esyscmd', `ls')

m4´Â ´Ü¾î¸¦ ±¸¼ºÇÒ ¶§¿¡ Çѹø¿¡ ÇÑ ¹®ÀÚ¾¿ ¸¸µé±â ¶§¹®¿¡, changeword¿¡°Ô °Ç³×Áö´Â Á¤±ÔÇ¥Çö½Ä¿¡´Â Á¦ÇÑÀÌ ÀÖ´Ù. ¸¸ÀÏ ¿©·¯ºÐÀÇ Á¤±Ô Ç¥Çö½ÄÀÌ `foo'¸¦ ¹Þ¾ÆµéÀδٸé, `f'¿Í `fo'µµ ¹Þ¾Æµé¿©¾ß ÇÑ´Ù.

changeword´Â ¶Ç´Ù¸¥ ±â´ÉÀ» °¡Áö°í ÀÖ´Ù. Á¦°øµÈ Á¤±ÔÇ¥Çö½ÄÀÌ ´ë°ýÈ£(braket, [ ] )·Î ¹­ÀÎ º¸Á¶Ç¥Çö½ÄÀ» ¸î °³À̵çÁö Æ÷ÇÔÇÑ´Ù¸é, ÀÌ°ÍÀÇ Ã¹ ¹ø°ÀÇ ¹Ù±ù¿¡ ÀÖ´Â ÅؽºÆ®´Â ±âÈ£ ¼ø¶÷(lookup) Àü¿¡ »èÁ¦µÈ´Ù. ±×·¡¼­ :

changecom(`/*', `*/')
changeword(`#\([_a-zA-Z0-9]*\)')
#esyscmd(ls)

m4´Â ÀÌÁ¦ ¸ðµç ¸ÅÅ©·Î È£Ãâ ÀÌÀü¿¡ `#' Ç¥½Ã¸¦ Çϵµ·Ï ¿ä±¸ÇÑ´Ù. ±×·¡¼­ ÀÌ°ÍÀº ¼Ð ½ºÅ©¸³Æ®¸¦ Àüó¸®ÇÏ´Â µ¥¿¡ m4¸¦ »ç¿ëÇÒ ¶§¿¡ shift ¸í·É¾î¸¦ Áý¾î »ïÄÑ ¹ö¸®Áö ¾Ê°Ô Çϸç, ÀϹÝÀûÀÎ ¹®¼­¸¦ Àüó¸®ÇÒ ¶§¿¡´Â °øÅëµÇ´Â ´Ü¾îµéÀ» ÀÒ¾î¹ö¸®Áö ¾Ê°Ô ÇÒ °ÍÀÌ´Ù.

TeXÀÌ ÅäÅ«¿¡ ±âÃÊÇÑ´Ù¸é m4ÀÇ ¸ÅÅ©·Î ġȯÀº ÅؽºÆ®¿¡ ±âÃÊÇÑ´Ù. changeword´Â ÀÌ·¯ÇÑ Â÷ÀÌÁ¡¿¡¼­ ¿À´Â °ÆÁ¤À» ¾ø¾Ù ¼ö ÀÖ´Ù. ¿¹¸¦ µé¸é, °°Àº ¾ÆÀ̵ð¾î°¡ TeX°ú m4¿¡¼­ ¾î¶»°Ô Ç¥ÇöµÇ´ÂÁö º¸¿© ÁÖ°Ú´Ù. ¸ÕÀú, TeX ¹öÀü:

\def\a{\message{Hello}}
\catcode`\@=0
\catcode`\\=12
=>@a
=>@bye

´ÙÀ½Àº m4 ¹öÀü:

define(a, `errprint(`Hello')')
changeword(`@\([_a-zA-Z0-9]*\)')
=>@a

TeXÀÇ ¿¹¿¡¼­, ù ¹ø° ÁÙÀº a ¸ÅÅ©·Î°¡ `Hello' ¸Þ½ÃÁö¸¦ Ãâ·ÂÇϵµ·Ï Á¤ÀÇÇÑ´Ù. µÎ ¹ø° ÁÙÀº \ ´ë½Å¿¡ @À» À̽ºÄÉÀÌÇÁ ¹®ÀÚ·Î »ç¿ëÇÒ ¼ö ÀÖµµ·Ï Á¤ÀÇÇÑ´Ù. ¼¼ ¹ø° ÁÙÀº \¸¦ À̽ºÄÉÀÌÇÁ ¹®ÀÚ°¡ ¾Æ´Ñ ÀϹÝÀûÀÎ ÇÁ¸°Æà °¡´ÉÇÑ ¹®ÀÚ·Î Á¤ÀÇÇÑ´Ù. ³× ¹ø° ÁÙÀº ¸ÅÅ©·Î a¸¦ ºÒ·¯³½´Ù. µû¶ó¼­, ÀÌ ÆÄÀÏ·Î TeXÀ» ½ÇÇà½Ãų ¶§ `Hello' ¸Þ½ÃÁö¸¦ º¸¿©ÁÖ°Ô µÈ´Ù.

À§ÀÇ m4 ¿¹Á¦¸¦ m4¿¡ ³Ö¾î¼­ ½ÇÇàÇÑ´Ù¸é, `errprint(Hello)'¸¦ Ãâ·ÂÇÒ °ÍÀÌ´Ù. ±× ÀÌÀ¯´Â TeXÀº ¸ÅÅ©·Î°¡ Á¤ÀÇµÉ ¶§¿¡ ¸ÅÅ©·Î Á¤ÀǸ¦ ¾îÈÖ ºÐ¼®Çϱ⠶§¹®ÀÌ´Ù. m4´Â ÅؽºÆ®¸¦ ´ÜÁö ÀúÀ常 ÇÏ°í, ¸ÅÅ©·Î°¡ »ç¿ëµÉ ¶§±îÁö ¾îÈÖ ºÐ¼®À» º¸·ùÇÑ´Ù.

changeword¸¦ »ç¿ëÇϸé m4°¡ 7ºÐÀÇ 1 Âë ´À·ÁÁú °ÍÀ̶ó´Â °ÍÀ» ¾Ë¾Æ µÎ½Ã¿À.

ÀÔ·ÂÀ» ÀúÀåÇϱâ

m4¿¡¼­´Â º¸ÅëÀÇ ÀÔ·ÂÀÌ ³¡³¯ ¶§±îÁöÀÇ ÅؽºÆ®¸¦ ÀúÀåÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù. ÅؽºÆ®¸¦ ÀúÀåÇؼ­, º¸ÅëÀÇ ÀÔ·ÂÀÌ ´Ù µÇ¾úÀ» ¶§ ´Ù½Ã m4·Î ÀоîµéÀÌ´Â °ÍÀÌ °¡´ÉÇÏ´Ù. ÀÌ ±â´ÉÀº Á¤»óÀûÀÎ Á¾·á¸¦ ÇϱâÀü¿¡ Àӽà ÆÄÀÏÀ» ¾ø¾Ø´Ù´øÁö Çϴ û¼Ò ÀÛ¾÷À» ÃʱâÈ­ ÇÏ´Â µ¥¿¡ »ç¿ëµÈ´Ù.

ÀÔ·Â ÅؽºÆ®¸¦ ÀúÀåÇÏ·Á¸é, ³»Àå ¸ÅÅ©·ÎÀÎ m4wrapÀ» »ç¿ëÇÏ¸é µÈ´Ù.

m4wrap(string, ...)

ÀÌ·¸°Ô Çϸé string°ú ³ª¸ÓÁö ÀÎÀÚ´Â ¾ÈÀüÇÑ Àå¼Ò¿¡ ÀúÀåµÇ°í, ÀÔ·ÂÀÌ ³¡¿¡ µµ´ÞÇßÀ» ¶§ ´Ù½Ã ÀÐÇôÁø´Ù.

define(`cleanup', `This is the `cleanup' actions.
')
=>
m4wrap(`cleanup')
=>
This is the first and last normal input line.
=>This is the first and last normal input line.
^D
=>This is the cleanup actions.

ÀúÀåµÈ ÀÔ·ÂÀº º¸ÅëÀÇ ÀÔ·ÂÀÌ ³¡³µÀ» ¶§¿Í, m4¸¦ Á¾·áÇϱâ À§Çؼ­ m4exit¸¦ »ç¿ëÇÏÁö ¾ÊÀ» ¶§¿¡¸¸ ´Ù½Ã ÀÐÇôÁø´Ù.

ÀúÀåµÈ ÅؽºÆ®·ÎºÎÅÍ m4wrapÀ» È£ÃâÇÏ´Â °ÍÀº ¾ÈÀüÇϱä ÇÏÁö¸¸, ±×·¸°Ô Çϸé ÀúÀåµÈ ÅؽºÆ®¸¦ ´Ù½Ã ÀоîµéÀÌ´Â ¼ø¼­´Â Á¤ÀǵÇÁö ¾Ê´Â´Ù. m4wrapÀÌ Àç±ÍÀûÀ¸·Î »ç¿ëµÇÁö ¾Ê´Â´Ù¸é, ÀúÀåµÈ ÅؽºÆ®ÀÇ Á¶°¢Àº ÀúÀåµÈ ¼ø¼­ÀÇ ¹Ý´ë ¼ø¼­·Î ÀÐÇôÁø´Ù. (LIFO--last in, first out).


Go to the first, previous, next, last section, table of contents.