Previous: Ifelse, Up: Conditionals   [Contents][Index]


5.3 ¥ë¡¼¥×¤ÈºÆµ¢

m4¤Ç¤Ï¥ë¡¼¥×½èÍý¤¬Ä¾ÀÜŪ¤Ë¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¤¬¡¢ ºÆµ¢Åª¤Ê¥Þ¥¯¥í¤òÄêµÁ¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤¹¡£ »ÈÍѤ·¤Æ¤¤¤ë¥Ï¡¼¥É¥¦¥§¥¢¤È¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¥·¥¹¥Æ¥à¤Ë¤è¤ë¤â¤Î°Ê³°¡¢ ºÆµ¢¤Î¿¼¤µ¤ËÀ©¸Â¤Ï¤¢¤ê¤Þ¤»¤ó¡£

¥ë¡¼¥×½èÍý¤ÏºÆµ¢¤È¤¹¤Ç¤ËÀâÌÀ¤·¤¿¾ò·ï¹½Ê¸¤ò»È¤¦¤³¤È¤Ç¼Â¸½¤Ç¤­¤Þ¤¹¡£

¥Þ¥¯¥í¤Î¼Â°ú¿ô¤òÈ¿Éü½èÍý¤¹¤ë¤È¤­¤Ë¤ÏÁȤ߹þ¤ß¥Þ¥¯¥íshift¤ò »È¤¦¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£

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¤½¤·¤ÆºÆµ¢¤ò»È¤¨¤Ð¥ë¡¼¥×½èÍý¤ò¤É¤ó¤Ê¤Ë´Êñ¤Ë ¼Â¸½¤Ç¤­¤ë¤«¼¨¤·¤Æ¤¤¤Þ¤¹¡£

¼¡¤Ëµó¤²¤ë¤Î¤Ï¡¢Ã±½ã¤Êfor¥ë¡¼¥×¤ò¼Â¸½¤¹¤ë¥Þ¥¯¥í¤ÎÎã¤Ç¤¹¡£ ñ½ã¤Ê¿ô¤¨¾å¤²¤Î¤¿¤á¤Ê¤É¤Ë»È¤¨¤Þ¤¹¡£

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

¤½¤ì¤¾¤ì¤Î°ú¿ô¤Ï½ç¤Ë¡¢È¿ÉüÊÑ¿ô¡Êiteration variable¡Ë¤Î̾Á°¡¢ ³«»ÏÃÍ¡¢½ªÎ»ÃÍ¡¢¤½¤·¤ÆÈ¿Éü¤¹¤ë¤¿¤Ó¤ËŸ³«¤µ¤ì¤ë¥Æ¥­¥¹¥È¤Ç¤¹¡£ ¤³¤Î¥Þ¥¯¥í¤Ë¤ª¤¤¤Æ¡¢¥Þ¥¯¥íi¤Ï¥ë¡¼¥×½èÍý¤ÎÆâÉô¤Ç¤À¤±ÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ i¤¬°ÊÁ°¤ËÃͤò»ý¤Ã¤Æ¤¤¤¿¾ì¹ç¤Ï¡¢¥ë¡¼¥×¤¬½ª¤ì¤Ð¤Þ¤¿¤½¤ÎÃͤˤâ¤É¤ê¤Þ¤¹¡£

forloop¤Ï¼¡¤Î¤è¤¦¤ËÆþ¤ì»Ò¤Ë¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£

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¥Þ¥¯¥í¼«ÂΤÏñ¤Ê¤ë¥é¥Ã¥Ñ¡¼(wrapper)¤Ç¡¢ Âè1°ú¿ô¤¬»ý¤Ä¸µ¤ÎÄêµÁ¤òÊݸ¤·¤Æ¤«¤é¡¢ÆâÉô¥Þ¥¯¥í_forloop¤ò¸Æ¤Ó¡¢ ºÆ¤ÓÊݸ¤·¤Æ¤ª¤¤¤¿Âè1°ú¿ô¤ÎÄêµÁ¤òºÆ³ÎΩ¤·¤Þ¤¹¡£

¥Þ¥¯¥í_forloop¤ÏÂè4°ú¿ô¤ò°ìÅÙŸ³«¤·¡¢¤³¤ì¤ÇÈ¿Éü¤¬½ª¤ê¤«¤É¤¦¤«Ä´¤Ù¤Þ¤¹¡£ ¤â¤·½ª¤ê¤Ç¤Ê¤±¤ì¤Ð¡¢È¿ÉüÊÑ¿ô¤ò(¤¹¤Ç¤ËÄêµÁºÑ¤ß¤Î¥Þ¥¯¥íincr¤ò»È¤Ã¤Æ) 1Áý¤ä¤·¤Æ¤«¤é¡¢¼«Ê¬¼«¿È¤òºÆµ¢Åª¤Ë¸Æ¤Ó½Ð¤·¤Þ¤¹¡£

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')')')

Ãí°Õ¿¼¤¤°úÍÑÉä¤Î»È¤¤Êý¤ËÃíÌܤ·¤Æ¤¯¤À¤µ¤¤¡£ ¥Þ¥¯¥í¤Î°ú¿ô¤Ç¥¯¥©¡¼¥È¤µ¤ì¤Æ¤¤¤Ê¤¤¤Î¤Ï3¤Ä¤À¤±¤Ç¡¢ ¤½¤ì¤¾¤ì¤Ë¸ÇÍ­¤ÎÍýͳ¤¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤é3¤Ä¤Î°ú¿ô¤¬¥¯¥©¡¼¥È ¤µ¤ì¤Æ¤¤¤Ê¤¤¤Î¤Ï¤Ê¤¼¤«¡¢¤½¤ÎÍýͳ¤ò¸«¤Ä¤±¤Æ¤¯¤À¤µ¤¤¡¢ ¤³¤ì¤é¤¬¥¯¥©¡¼¥È¤µ¤ì¤Æ¤¤¤ë¤È¡¢¤É¤¦¤Ê¤ë¤Î¤«¤â³Î¤«¤á¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£

¤³¤ì¤é2¤Ä¤Î¥Þ¥¯¥í¤ÏÊØÍø¤Ç¤Ï¤¢¤ê¤Þ¤¹¤¬¡¢ °ìÈ̤λÈÍѤËÂѤ¨¤ë¤Û¤É·øÏ´¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£ ³«»ÏÃͤ¬½ªÎ»Ãͤè¤ê¾®¤µ¤¤¾ì¹ç¤ä¡¢Âè1°ú¿ô¤¬Ì¾Á°¤Ç¤Ê¤«¤Ã¤¿¾ì¹ç¤Ê¤É¡¢ ½éÊâŪ¤Ê¥¨¥é¡¼Âкö¤µ¤¨·ç¤¤¤Æ¤¤¤Þ¤¹¡£ ¤³¤ì¤éÉÔÈ÷¤ÎÄûÀµ¤Ï¡¢ÆÉ¼Ô¤Ø¤Î²ÝÂê¤È¤·¤Æ»Ä¤·¤Æ¤ª¤­¤Þ¤¹¡£