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


Á¶°Ç, ·çÇÁ, Àç±Í

º¸ÅëÀÇ ÅؽºÆ®·Î È®ÀåÇÏ´Â, ¾Æ¸¶µµ È£Ãâ ÀÎÀÚ¸¦ °¡Áú ¼öµµ ÀÖ´Â, ¸ÅÅ©·Î¸¸À¸·Î´Â ±×´ÙÁö ÃæºÐÇÏÁö ¸øÇÏ´Ù. ¿ì¸®°¡ ¿øÇÏ´Â °ÍÀº ½ÇÇà-½Ã(run-time)¿¡ °áÁ¤µÇ´Â Á¶°Ç ÆÇ´Ü¿¡ ±âÃÊÇؼ­ ´Ù¸¥ °Íµé·Î È®ÀåÇÏ´Â ¸ÅÅ©·ÎÀÌ´Ù. ¿¹¸¦ µé¸é ¾î¶² Á¾·ùÀÇ Á¶°ÇºÎ-Á¦¾î¹®(conditional)ÀÌ ÇÊ¿äÇÏ´Ù. ¶ÇÇÑ, ¾î¶² Á¾·ùÀÇ ·çÇÁ ±¸Á¶°¡ À־, ¾î¶² ÀÏÀ» ¿©·¯ ¹ø, ¶Ç´Â ¾î¶² Á¶°ÇÀÌ ÂüÀÎ µ¿¾È¸¸, ÇÒ ¼ö ÀÖÀ¸¸é ÁÁÀ» °ÍÀÌ´Ù.

¸ÅÅ©·Î Á¤ÀÇ Å×½ºÆ®

m4¿¡´Â µÎ °³ÀÇ ´Ù¸¥ ³»Àå Á¶°Ç¹®ÀÌ ÀÖ´Ù. ù ¹ø°´Â ifdefÀÌ´Ù.

ifdef(name, string-1, opt string-2)

ÀÌ°ÍÀº ¸ÅÅ©·Î°¡ ÀÌ¹Ì Á¤ÀÇ°¡ µÇ¾ú´ÂÁö ±×·¸Áö ¾ÊÀºÁö ÆÇ´ÜÇÏ´Â °ÍÀÌ´Ù. nameÀÌ Á¤ÀÇµÈ ¸ÅÅ©·ÎÀÇ ¸íĪÀ̶ó¸é ifdef´Â string-1À¸·Î È®ÀåµÇ°í, ¾Æ´Ï¸é string-2·Î È®ÀåµÈ´Ù. string-2¸¦ »ý·«ÇÑ´Ù¸é, ±×°ÍÀº (ÀϹÝÀûÀÎ ±ÔÄ¢À» µû¶ó¼­) ºó ¹®ÀÚ¿­ÀÌ µÈ´Ù.

ifdef(`foo', ``foo' is defined', ``foo' is not defined')
=>foo is not defined
define(`foo', `')
=>
ifdef(`foo', ``foo' is defined', ``foo' is not defined')
=>foo is defined

ifdef ¸ÅÅ©·Î´Â ´ÜÁö ÀÎÀÚ°¡ ÀÖÀ» ¶§¿¡¸¸ ÀνĵȴÙ.

¹®ÀÚ¿­ ºñ±³

Á¶°ÇºÎ-Á¦¾î¹® Áß ³ª¸ÓÁö´Â ifelseÀε¥, ÀÌ°ÍÀº ÈξÀ °­·ÂÇÏ´Ù. ifelse ´Â ±ä ÁÖ¼®À» ¸¸µç´ÙµçÁö, ¶Ç´Â ÀϹÝÀûÀÎ if-else ¿Í °°ÀÌ »ç¿ëÇÒ ¼öµµ ÀÖ°í ¿©·¯ °³·Î °¡Áö¸¦ »¸À» ¼ö ÀÖ´Ù. ÀÌ°ÍÀº ÀüÀûÀ¸·Î Á¦°øµÇ´Â ÀÎÀÚÀÇ °¹¼ö¿¡ ÀÇÁ¸ÇÑ´Ù.

ifelse(comment)
ifelse(string-1, string-2, equal, opt not-equal)
ifelse(string-1, string-2, equal, ...)

ÇϳªÀÇ ÀÎÀÚ¸¸À¸·Î ifelse¸¦ »ç¿ëÇÑ´Ù¸é, ifelse ´Â ±× ÀÎÀÚ¸¦ ¾ø¾Ö ¹ö¸®¸ç, ¾Æ¹«·± Ãâ·Âµµ ÇÏÁö ¾Ê´Â´Ù. ÀÌ°ÍÀº ÁÖ¼®À» ºí·Ï´ÜÀ§·Î ¸¸µé ¶§ ¿©·¯ ¹ø ¹Ýº¹ÇÏ¿© dnlÀ» »ç¿ëÇÏ´Â °Í¿¡ ´ëÇÑ ´ë¾ÈÀ¸·Î½á »ç¿ëÇÏ´Â m4ÀÇ ÀϹÝÀûÀÎ °ü½ÀÀÌ´Ù. ÀÌ·± Ưº°ÇÑ »ç¿ë¹ýÀº GNU m4°¡ ÀνÄÇϸç, ±×·¡¼­ ÀÌ·± °æ¿ì¿¡ ÀÎÀÚ¿Í °ü·ÃµÈ °æ°í´Â °áÄÚ ¹ß»ýµÇÁö ¾Ê´Â´Ù.

¼¼ °³³ª ³× °³ÀÇ ÀÎÀÚ¸¦ Á༭ È£ÃâÇÑ´Ù¸é, ifelse´Â string-1°ú string-2°¡ (ÇÑ ±ÛÀÚ ÇÑ ±ÛÀÚ ¸ðµÎ ´Ù) °°À» °æ¿ì´Â equal·Î È®ÀåµÇ°í ´Ù¸¥ °æ¿ì´Â not-equal·Î È®ÀåµÈ´Ù.

ifelse(foo, bar, `true')
=>
ifelse(foo, foo, `true')
=>true
ifelse(foo, bar, `true', `false')
=>false
ifelse(foo, foo, `true', `false')
=>true

ifelse´Â ³× °³º¸´Ù ´õ ¸¹Àº ÀÎÀÚ¸¦ °¡Áú ¼ö ÀÖ´Ù. ³× °³º¸´Ù ¸¹Àº ÀÎÀÚ°¡ ÁÖ¾îÁø´Ù¸é ifelse´Â case³ª switch ±¸¹®°ú °°Àº ÀüÅëÀûÀÎ ÇÁ·Î±×·¡¹Ö ¾ð¾î¿Í °°ÀÌ ÀÛµ¿ÇÑ´Ù. string-1°ú string-2°¡ °°´Ù¸é ifelse´Â equal·Î È®ÀåµÇ°í, ±×·¸Áö ¾ÊÀº °æ¿ì´Â ù ¼¼ °³ÀÇ ÀÎÀÚ¸¦ °Ç³Ê¶Ù°í ¾ÕÀÇ °úÁ¤À» ´Ù½Ã µÇÇ®ÀÌ ÇÑ´Ù. ¿©±â¿¡ °£´ÜÇÑ ¿¹¸¦ µé ÇÊ¿ä°¡ ÀÖ°Ú´Ù. :

ifelse(foo, bar, `third', gnu, gnats, `sixth', `seventh')
=>seventh

ÀÚ¿¬È÷, ½ÇÁ¦ÀÇ °æ¿ì´Â À§ÀÇ ¿¹Á¦º¸´Ù´Â Á» ´õ º¹ÀâÇÑ ¾ç»óÀ» ¶ì°Ô µÉ °ÍÀÌ´Ù. ifelse¸¦ ÀϹÝÀûÀ¸·Î ¾²´Â °æ¿ì ÁßÀÇ Çϳª´Â ´Ù¾çÇÑ Á¾·ùÀÇ ·çÇÁ¸¦ ±¸ÇöÇÏ´Â ¸ÅÅ©·Î¸¦ ¸¸µé ¶§ÀÌ´Ù.

ifelse ¸ÅÅ©·Î´Â ÀÎÀÚ°¡ ÀÖÀ» ¶§¿¡¸¸ ÀνĵȴÙ.

·çÇÁ¿Í Àç±Í

m4¿¡¼­´Â ·çÇÁ¸¦ Á÷Á¢ Á¦°øÇÏÁö ¾Ê´Â´Ù. ÇÏÁö¸¸ ¸ÅÅ©·Î´Â Àç±ÍÀûÀ¸·Î µÉ ¼ö ÀÖ´Ù. Àç±ÍÈ£Ãâ ´Ü°èÀÇ °¹¼ö¿¡´Â Á¦ÇÑÀÌ ¾ø´Ù. ¿©·¯ºÐÀÇ Çϵå¿þ¾î³ª ¿î¿µÃ¼Á¦¿¡ ÀÇÇØ Á¦ÇѵǴ °ÍÀº Á¦¿ÜÇÏ°í´Â...

·çÇÁ´Â, Àç±Í È£Ãâ°ú ¾Õ¿¡¼­ ¼³¸íÇÑ Á¶°Ç¹®À» ÀÌ¿ëÇÏ¿©, ÇÁ·Î±×·¡¹ÖµÉ ¼ö ÀÖ´Ù.

shift¶ó´Â ³»Àå ¸ÅÅ©·Î°¡ ÀÖ´Â µ¥ ÀÌ°ÍÀÌ ÇÏ´Â ¿ªÇÒÀº, ¿©·¯ °¡Áö°¡ ÀÖÁö¸¸ ±× Áß¿¡¼­, ¸ÅÅ©·Î°¡ È£ÃâµÉ ¶§ ÁÖ¾îÁø ÀÎÀÚµéÀ» µ¹·Á°¡¸ç µÇÇ®ÀÌ(iterate through) ÇÏ´Â µ¥¿¡ ¾²ÀδÙ.

shift(...)

°ýÈ£¾È¿¡´Â ¾î¶°ÇÑ °³¼öÀÇ ÀÎÀÚµµ ¿Ã ¼ö ÀÖÀ¸¸ç, ù ¹ø° ÀÎÀÚ¸¦ »© ¹ö¸®°í ¸ðµÎ È®ÀåµÇ¸ç °¢°¢ÀÇ ÀÎÀÚµéÀº µû¿ÈÇ¥·Î µÑ·¯½ÎÀÌ°í, ½°Ç¥·Î ºÐ¸®µÈ´Ù.

shift(bar)
=>
shift(foo, bar, baz)
=>bar,baz

½ÇÀü¿¡¼­ÀÇ shiftÀÇ »ç¿ë ¿¹´Â ´ÙÀ½ÀÇ ¸ÅÅ©·ÎÀε¥, ¿©±â¼­´Â °¢°¢ÀÇ ÀÎÀÚÀÇ ¼ø¼­¸¦ °Å²Ù·Î ¸¸µé°í ÀÖ´Ù.

define(`reverse', `ifelse($#, 0, , $#, 1, ``$1'',
`reverse(shift($@)), `$1'')')
=>
reverse
=>
reverse(foo)
=>foo
reverse(foo, bar, gnats, and gnus)
=>and gnus, gnats, bar, foo

º°·Î Èï¹ÌÀÖ´Â ¿¹´Â ¾Æ´ÏÁö¸¸, À§ÀÇ °ÍÀº shift¿Í ifelse¿Í Àç±ÍÈ£Ãâ·Î °£´ÜÇÑ ·çÇÁ¸¦ ¸¸µé ¼ö ÀÖ´Ù´Â °ÍÀ» º¸¿©ÁØ´Ù.

(¿ªÀÚÁÖ: ÀÌ ¸Å´º¾óÀÇ ¾ÕºÎºÐ('ÀÌ ¸Å´º¾óÀÇ »ç¿ë' Àý (node À̸§Àº '¸Å´º¾ó'ÀÓ)¿¡ ¹àÈù ´ë·Î forloop´Â »ç¿ëÀÚ-Á¤ÀÇ ¸ÅÅ©·ÎÀ̸ç, Á» ´õ µÚ¿¡ ÀÌ°ÍÀ» Á¤ÀÇÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ ¼³¸íÀÌ ³ª¿À¹Ç·Î ³¡±îÁö Àб⠹ٶ÷.)

ÀÌÁ¦ ·çÇÁ ¸ÅÅ©·Î forloopÀ» »ç¿ëÇÏ´Â °£´ÜÇÑ ¿¹Á¦¸¦ º¸ÀÚ. ¿¹¿¡¼­ º¸´Â ¹Ù¿Í °°ÀÌ ÀÌ°ÍÀº °£´ÜÇÑ ¼ýÀÚ¼¼±â¸¦ ÇÑ´Ù.

forloop(`i', 1, 8, `i ')
=>1 2 3 4 5 6 7 8

ÀÎÀÚ´Â Â÷·Ê´ë·Î ¹Ýº¹ º¯¼ö, Ãʱ⠰ª, ¸¶Áö¸· °ª, ¸Å ȸ È®ÀåµÉ ÅؽºÆ®ÀÌ´Ù. ¿©±â¿¡¼­ ¸ÅÅ©·Î i´Â ´ÜÁö ·çÇÁ³»ºÎ¿¡¼­¸¸ Á¤ÀǵȴÙ. ·çÇÁ°¡ ³¡³­ ÈÄ¿¡´Â ÀÌÀü¿¡ °¡Á³¾úÀ» Áöµµ ¸ð¸£´Â ±× °ªÀ» ±×´ë·Î À¯ÁöÇÑ´Ù.

For-loop´Â ´ÙÀ½°ú °°ÀÌ ÁßøµÉ ¼ö ÀÖ´Ù.

forloop(`i', 1, 4, `forloop(`j', 1, 8, `(i, j) ')
')
=>(1, 1) (1, 2) (1, 3) (1, 4) (1, 5) (1, 6) (1, 7) (1, 8)
=>(2, 1) (2, 2) (2, 3) (2, 4) (2, 5) (2, 6) (2, 7) (2, 8)
=>(3, 1) (3, 2) (3, 3) (3, 4) (3, 5) (3, 6) (3, 7) (3, 8)
=>(4, 1) (4, 2) (4, 3) (4, 4) (4, 5) (4, 6) (4, 7) (4, 8)
=>

forloop ¸ÅÅ©·ÎÀÇ ±¸ÇöÀº ¸Å¿ì °£´Ü¸í·áÇÏ´Ù. forloop ±× ÀÚü´Â ´Ü¼øÇÑ Æ÷ÀåÀÏ »ÓÀ̸ç, ±× Æ÷Àå¿¡¼­´Â ù ¹ø° ÀÎÀÚÀÇ ¿¹ÀüÀÇ Á¤ÀǸ¦ ÀúÀåÇÏ°í, ³»ºÎÀûÀÎ ¸ÅÅ©·ÎÀÎ _forloop¸¦ È£ÃâÇÏ°í, ¾Æ±î ÀúÀåÇØ ³õ¾Ò´ø ù ¹ø° ÀÎÀÚÀÇ Á¤ÀǸ¦ µÇµ¹·Á ³õ´Â´Ù.

_forloop ¸ÅÅ©·Î´Â ³× ¹ø° ÀÎÀÚ¸¦ ÇÑ ¹ø È®ÀåÇÑ ÈÄ, (·çÇÁ°¡) ³¡³µ´ÂÁö¸¦ °Ë»çÇÑ´Ù. ¾ÆÁ÷ ³¡³ªÁö ¾Ê¾Ñ´Ù¸é, (¹Ì¸® Á¤ÀÇµÈ ¸ÅÅ©·Î incrÀ» ÀÌ¿ëÇÏ¿©,) ¹Ýº¹ º¯¼ö¸¦ Áõ°¡½ÃÅ°°í, ÀÚ½ÅÀ» Àç±ÍÈ£Ãâ ÇÑ´Ù. (see section Áõ°¡¿Í °¨¼Ò ¿¬»êÀÚ)

¿©±â¿¡ forloop¸¦ Á¤ÀÇÇÑ À¯¿ëÇÑ ¸ÅÅ©·Î°¡ ÀÖ´Ù.

define(`forloop',
`pushdef(`$1', `$2')_forloop(`$1', `$2', `$3', `$4')popdef(`$1')')
define(`_forloop',
`$4`'ifelse($1, `$3', ,
`define(`$1', incr($1))_forloop(`$1', `$2', `$3', `$4')')')

µû¿ÈÇ¥¸¦ ÁÖÀÇ ±í°Ô »ç¿ëÇÑ °ÍÀ» ´« ¿©°Ü º¸¶ó. ¼¼ °³ÀÇ ÀÎÀÚ¸¸ÀÌ µû¿ÈÇ¥°¡ ¾ø´Âµ¥, °¢°¢¿¡´Â ³ª¸§´ë·Î ÀÌÀ¯°¡ ÀÖ´Ù. ÀÌµé ¼¼ °³ÀÇ ÀÎÀÚ¿¡ ¿Ö µû¿ÈÇ¥°¡ ¾ø´Â Áö¸¦ ¾Ë·Á¸é, µû¿ÈÇ¥·Î ¹­¾ú´Ù¸é ¾î¶² ÀÏÀÌ ÀϾ´Â Áö¸¦ »ìÆ캸¸é µÈ´Ù.

ÀÌÁ¦, ÀÌµé µÎ ¸ÅÅ©·Î°¡ À¯¿ëÇϱâ´Â ÇÒ Áö¶óµµ, ±×·¡µµ ÀϹÝÀûÀÎ »ç¿ë¿¡´Â ÃæºÐÈ÷ Æ°Æ°ÇÏÁö´Â ¾Ê´Ù. ±×°Íµé¿¡´Â ¸¶Áö¸· °ªÀÌ Ãʱ⠰ªº¸´Ù ÀÛÀ» ¶§¶óµç°¡, ù ¹ø° ÀÎÀÚ°¡ ¸íĪÀÌ µÉ ¼ö ¾ø´Â °ÍÀÌ ÁÖ¾îÁú °æ¿ì¿Í °°Àº ±âÃÊÀûÀÎ ¿À·ù 󸮰¡ ¹Ì¾àÇÏ´Ù. ÀÌµé ¿À·ù¸¦ ¹Ù·Î Àâ´Â ÀÏÀº µ¶Àڵ鿡°Ô ¿¬½À¹®Á¦·Î ³²°ÜµÐ´Ù.


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