ÀÌ Àå¿¡¼´Â 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
¿Í ±×¿Í ¿¬°üµÈ ±â´ÉµéÀº ½ÃÇèÀûÀÎ °ÍÀÌ´Ù. ÀÌ ±â´ÉÀº GNUm4
¸¦ ¼³Ä¡ÇÒ ¶§¿¡ 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.