219ÂÊ: ´ÙÀ½°ú °°Àº ¸ÅÅ©·Î Á¤ÀÇ°¡ ÀÖ´Ù°í ÇսôÙ.
\def\foo{¾î¼±¸ Àú¼±¸ ... \bar ... Àú¼±¸ ¾î¼±¸}Áï ¸ÅÅ©·Î \fooÀÇ replacement text ¾È¿¡ ´Ù¸¥ ¸ÅÅ©·Î \bar°¡ ÀÖ´Â °æ¿ìÀÔ´Ï´Ù. ÀÌ °æ¿ì, ¾Æ¸¶µµ TeXÀº \foo ¸ÅÅ©·Î¸¦ Àü°³ÇÏ´Ù°¡ \bar ¸ÅÅ©·Î¸¦ ¸¸³ª´Â ¼ø°£ \bar ¸ÅÅ©·ÎÀÇ Àü°³¸¦ ¸¶Ä£ ´ÙÀ½, ³²¾Æ ÀÖ´Â \foo ¸ÅÅ©·Î¸¦ °è¼Ó Àü°³Çϱâ À§Çؼ \foo ¸ÅÅ©·ÎÀÇ replacement text ³»ÀÇ \bar ¸ÅÅ©·Î ´ÙÀ½ÀÇ ÅäÅ« À§Ä¡¸¦ ±â¾ïÇØ µÎ¾î¾ß ÇÒ °ÍÀÔ´Ï´Ù. ¸¸¾à¿¡ \bar ¸ÅÅ©·Î ¿ª½Ã ±×ÀÇ replacement text ¾È¿¡ ´Ù¸¥ ¸ÅÅ©·Î°¡ ÀÖ´Ù¸é, \foo ¿Í ¸¶Âù°¡Áö·Î ¸Þ¸ð¸®ÀÇ ¾îµò°¡¿¡ °è¼Ó Àü°³ÇÒ ÅäÅ«ÀÇ À§Ä¡¸¦ Àû¾îµÎ¾î¾ß ÇÒ °ÍÀÔ´Ï´Ù.
±×·±µ¥, ¹®Á¦´Â À§ÀÇ ¿¹¿¡¼ \bar°¡ \fooÀÎ °æ¿ìÀÔ´Ï´Ù. Áï, ¾Æ·¡¿Í °°Àº °æ¿ìÀε¥,
\def\foo{¾î¼±¸ Àú¼±¸ ... \foo ... Àú¼±¸ ¾î¼±¸}ÀÌ·¯ÇÑ °æ¿ì¸¦ recursion À̶ó°í ÇÕ´Ï´Ù. ¿ì¸®¸»·Î 'Àç±Í'¶ó°í ÇÕ´Ï´Ù. °£´ÜÈ÷ ¸»Çؼ ¾î¶² °ÍÀ» Á¤ÀÇÇϴµ¥, ±× Á¤ÀÇ¿¡ ¾î¶² °Í Áï ÀÚ±â ÀÚ½ÅÀÌ ÀÌ¿ëµÈ´Â °ÍÀÔ´Ï´Ù. ¿¹¸¦ µé¾î GNU ¸ðµÎ ¾Æ½ÃÁÒ? ÀÌ GNUÀÇ Á¤ÀÇ°¡ GNU is Not UnixÀÇ ¾àÀÚ¶ó°í ÇÕ´Ï´Ù. GNU¸¦ Á¤ÀÇÇϴµ¥ GNU°¡ »ç¿ëµÇ¾ú±â ¶§¹®¿¡ ÀÌ ¿ª½Ã recursion À̶ó°í ÇÒ ¼ö ÀÖ½À´Ï´Ù. (¿ÂÅë Àç±Í·Î ÀÌ·ç¾îÁø, Àç±Í°¡ »ý¸íÀÎ ÄÄÇ»ÅÍ ÇÁ·Î±×·¡¹Ö ¾ð¾î Lisp°ú ±× lispÀ¸·Î ¸ðµç °ÍÀ» ´Ù ÇÒ ¼ö ÀÖ´Â emacs, ±×¸®°í ÀÌ emacs¸¦ ¸¸µç ½ºÅ縸, ½ºÅ縸ÀÌ ±íÀÌ °ü¿©ÇÏ°í ÀÖ´Â GNU. ÀÌ ¸ðµÎ°¡ GNUÀÇ Àç±ÍÀû Á¤ÀǸ¦ °®°Ô µÈ °Í°ú ¹«°üÇÏÁö ¾ÊÀ» °ÍÀÔ´Ï´Ù. Á¦ ÃßÃøÀÔ´Ï´Ù.)
À§ÀÇ \foo¿Í °°Àº ¸ÅÅ©·Î¸¦ Àü°³ÇÒ¶§ ¸¶´Ù, TeXÀº replacement text ³»ÀÇ \foo ´ÙÀ½ÀÇ
ÅäÅ« À§Ä¡¸¦ ±â¾ïÇϱ⠸޸𸮸¦ °è¼Ó »ç¿ëÇÒ °ÍÀÔ´Ï´Ù. ¾Æ¸¶µµ ÄÄÇ»ÅÍ ÇÁ·Î±×·¡¹Ö¿¡¼ ÀÚÁÖ »ç¿ëµÇ´Â
½ºÅÃÀ̶ó´Â °ÍÀ» ÀÌ¿ëÇÒ °Í°°Àºµ¥, \foo°¡ Àü°³µÉ¶§¸¶´Ù ½ºÅÿ¡´Â \fooÀÇ ´ÙÀ½ ÅäÅ« À§Ä¡¸¦
±â¾ïÇϱâ À§Çؼ ±× ¸Þ¸ð¸® ¹øÁö°¡ ¸¹ÀÌ ½×ÀÏ °ÍÀÔ´Ï´Ù. ½ºÅÃÀÇ Àǹ̸¦ ¸ô¶óµµ ±×Àú ÄÄÇ»ÅÍÀÇ
¸Þ¸ð¸®¸¦ ¸¹ÀÌ »ç¿ëÇÑ´Ù°í ÀÌÇØÇÏ¸é µÉ °ÍÀÔ´Ï´Ù. ÄÄÇ»ÅÍÀÇ ¸Þ¸ð¸® ¶ÇÇÑ ÄÄÇ»ÅÍÀÇ ÀÚ¿øÀÌ°í,
ÄÄÇ»ÅÍ°¡ ÀÚ¿øÀ» ¸¹ÀÌ »ç¿ëÇÑ´Ù´Â Àǹ̴ ½Ã°£°ú ÀÚ¿ø Ãø¸é¿¡¼ ±×¸® È¿À²ÀûÀÌÁö ¸øÇÕ´Ï´Ù.
ÇÏÁö¸¸, °°Àº recursive ¸ÅÅ©·Î¶óµµ ´ÙÀ½°ú °°Àº °æ¿ì´Â ¾î¶³±î¿ä?
\def\foo{¾î¼±¸ Àú¼±¸ ... \foo}À§ÀÇ Àç±Í¿Í ´Ù¸¥ Á¡Àº replacement text³»ÀÇ \foo ´ÙÀ½¿¡ ¾Æ¹«·± ÅäÅ«µµ ¾ø´Ù´Â Á¡ÀÔ´Ï´Ù. ÀÌ·¯ÇÑ Àç±ÍÀÇ ÀåÁ¡Àº TeXÀÌ \foo ´ÙÀ½ÀÇ À§Ä¡¸¦ ±â¾ïÇÒ ÇÊ¿ä°¡ ¾ø´Ù´Â Á¡ÀÔ´Ï´Ù. ¿Ö³ÄÇϸé \fooÀÇ Àü°³¸¦ ¸¶Ä¡°í ±× ´ÙÀ½À» °è¼Ó Àü°³Çϱâ À§Çؼ ±× À§Ä¡·Î ¿ÔÁö¸¸, Àü°³ÇÒ °ÍÀÌ ¾ø±â ¶§¹®ÀÔ´Ï´Ù. µû¶ó¼ ÀÌ°æ¿ì´Â ½ºÅÿ¡ ´ÙÀ½¿¡ Àü°³ÇÒ ÅäÅ«ÀÇ À§Ä¡¸¦ ±â¾ïÇÒ ÇÊ¿äµµ ¾ø½À´Ï´Ù.!!! ÀÌ·¯ÇÑ °æ¿ì ó·³ Àç±Í È£ÃâÀÌ ¸Ç ¸¶Áö¸·¿¡ ÀÖ´Ù°í Çؼ "tail recursion" À̶ó°í ÇÕ´Ï´Ù. ¿ì¸®¸»·Î '²¿¸®Àç±Í'¶ó°íµµ ÇÕ´Ï´Ù. ÀÌÁ¦ TeXbook¿¡ ÀÌ tail recursionÀ» ¼³¸íÇÏ¸é¼ ÇÏ´Â ¸»,
..., and the memory does not fill up during a long loop. ...
|
À» ÀÌÇØÇÒ ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù.
¶ÇÇÑ TeXbyTopic À̶ó´Â Ã¥ÀÇ 11.8.3 Tail recursion¿¡ ³ª¿ÍÀÖ´Â ´ÙÀ½°ú °°Àº ¸»µµ
½±°Ô ÀÌÇØÇÒ ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù.
In general this 'stack build-up' is a necessary evil, but it can be prevented
if the nested macro call is the last token in the replacement text of the original
macro. After the last token no further tokens need to be considered, so one might
as well clear the top item from the input stack before a new one is put there.
This is what TeX does.
|
¾î·Æ°Ô¸¸ º¸ÀÌ´ø TeXbyTopic À̶ó´Â Ã¥ÀÌ ¸¸¸¸ÇØ º¸ÀÔ´Ï´Ù. ½Å³³´Ï´Ù.
ÀÌÁ¦ ¾ÆÁÖ Àλó±íÀº ¸ÅÅ©·Î \loop ... \repeat¸¦ ÀÌÇØÇÒ ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù.
TeXÀ» °øºÎÇÏ¸é¼ Àú ¸ÅÅ©·Î¸¦ º¸°í ÀÌÇØÇÏ´Â ¼ø°£Àº ¾ÆÁÖ °¨µ¿ÀûÀ̾ú½À´Ï´Ù.
¼öÇÐÀÚµéÀÌ ÈçÈ÷ ¸»ÇÏ´Â °Í ó·³ "¾Æ¸§´ä½À´Ï´Ù."
\def\loop#1\repeat{\def\body{#1}\iterate}
\def\iterate{\body\let\next=\iterate\else\let\next=\relax\fi\next}
¸¶Áö¸·À¸·Î Àú~~~ ¾Æ·¡¿¡¼ ¾ð±ÞÇÑ KnuthÀÇ ¾î·ÏÀ» ¸¶Áö¸·À¸·Î À̹ø µ¶ÈÄ°¨À» ¸¶Ä¡°Ú½À´Ï´Ù.
À§ÀÇ ¼³¸í¿¡¼ ó·³ recursionÀº ¸Å¿ì ¿¤·¹°½ºÇÏ°í °£´ÜÇÏÁö¸¸ ÄÄÇ»ÅÍ ÀÔÀå¿¡¼ º¸¸é
±×¸® È¿À²ÀûÀÌÁö ¸øÇÕ´Ï´Ù. ½ºÅÃÀ̶ó´Â ¸Þ¸ð¸®¸¦ »ç¿ëÇؾߵǰí, À§Ä¡¸¦ ÀúÀåÇؾߵǰí...
±×¸®°í ´ë°³ Àç±ÍÀûÀ¸·Î Á¤ÀÇµÈ ¹®Á¦´Â ¹Ýº¹Àû(iterate)À¸·Î ÇØ°áÇÒ ¼ö ÀÖ½À´Ï´Ù. ÇÏÁö¸¸,
ÇÁ·Î±×·¡¹ÖÀ» ÇÏ´Ùº¸¸é °¡²û recursionÀ» »ç¿ëÇÕ´Ï´Ù. ±× °£´Ü ¸í·áÇÔ¿¡ ¹ÝÇؼ ÀÌÁö¿ä.
°°Àº ¸Æ¶ôÀ¸·Î Knuthµµ ¸»ÇßÁö¿ä?
"... aesthetics are more important than efficiency"
|