±âÈ£ ÇÁ·Î±×·¡¹Ö

 

ÀΰøÁö´É ÀÌ·Ð ¹× ½ÇÁ¦ : Thomas Dean. James Allen. John Aloimonos °øÀú, ±èÁøÇü.¹Ú½Â¼ö.¹éÀº¿Á. ¼­Á¤¿¬.ÀÌÀϺ´ °ø¿ª, »çÀÌÅع̵ð¾î, 1998  (¿ø¼­ : Artificial Intelligence: Theory and Practice, 1995), Page 25~70

 

1. ±ÔÄ¢±â¹Ý ¹ÝÀÀ ½Ã½ºÅÛÀÇ ¿¹

2. Lisp ÀÇ ¼Ò°³

     ÇÁ·Î±×·¡¹Ö ¾ð¾î ¿ä±¸»çÇ×

     Common Lisp

     ¸®½ºÆ®¿Í Lisp ÀÇ ±¸¹®

     ±âÈ£ (symbol)

     ÇÁ·Î±×·¥°ú ¹®¼­È­

3. Lisp ¿Í ´ëÈ­Çϱâ

     Lisp Çؼ®±â

4. Lisp ¿¡¼­ÀÇ ÇÔ¼ö

     ÇÔ¼ö È£Ãâ

     ¼øÂ÷ÀûÀÎ Ãß»óÈ­

     Á¶°Ç¹®

     Àç±ÍÇÔ¼ö

     ÆÄÀÏ¿¡ ÀÖ´Â ÇÔ¼öÀÇ Æò°¡

5. ȯ°æ°ú ±âÈ£¿Í À¯È¿¹üÀ§

     ±âÈ£¿¡ °ª ÁöÁ¤Çϱâ

     Eval °ú Apply ÀÇ Àç¹æ¹®

     ±¸Á¶È­µÈ ȯ°æ

     Áö¿ªº¯¼ö

     »çÀüÀû À¯È¿¹üÀ§ °áÁ¤

6. ÇÔ¼ö¿¡ °üÇÑ Ãß°¡»çÇ×

     Áö¿ª»óŸ¦ °¡Áø ÇÔ¼ö

     ¶÷´Ù¿Í Àμö·Î¼­ÀÇ ÇÔ¼ö

7. ¸®½ºÆ® ó¸®

     Quote ¸¦ »ç¿ëÇÑ Æò°¡ÀÇ ÁßÁö

     ¸®½ºÆ®¿¡ ¿ø¼Ò¸¦ ¸¸µé°í Á¢±ÙÇϱâ

     ¸Þ¸ð¸®»óÀÇ ¸®½ºÆ®

     ¸Þ¸ð¸®»óÀÇ ¸®½ºÆ® ±¸Á¶ º¯°æ

     Àμö Àü´ÞÀÇ ´Ù¸¥ ¹æ¹ý

     ¸®½ºÆ®¿¡ °üÇÑ ¼ú¾î

     ¸®½ºÆ® Á¶ÀÛ ³»ºÎ ÇÔ¼ö

     ¼±Åà »ç¾çÀ¸·Î¼­ÀÇ Àμö

     ¸®½ºÆ® ó¸® ¿¹

     ÀÚ·á Ãß»óÈ­

8. ¹Ýº¹ ±¸Á¶

     ÇÔ¼ö¸¦ °¢ Àμö¿¡ ´ëÀÀÇϱâ

     ÀϹÝÀûÀÎ ¹Ýº¹

     °£´ÜÇÑ ¹Ýº¹

9. ÇÁ·Î±×·¥ÀÇ ¸ð´ÏÅ͸µ°ú µð¹ö±ë

     ÇÁ·Î±×·¥ÀÇ ÃßÀû°ú ´Ü°èº° °Ë»ç

     ¼­½Ä Ãâ·Â

10. ±ÔÄ¢±â¹Ý ¹ÝÀÀ ½Ã½ºÅÛÀÇ Àç¹æ¹®

¿ä¾à

¹è°æ

 

 

Fred ´Â ¸ðµç ¾ÆÆÄÆ® °Ç¹°Àº õÀåÀÇ ³ôÀÌ°¡ Àû¾îµµ 2.5 ¹ÌÅÍ ÀÌ»óÀ̾î¾ß ÇÑ´Ù´Â µµ½Ã°Ç¼³¹ýÀ» ÁýÁÖÀÎÀÌ ¾î°å´Ù°í È®½ÅÇÏ°í ÀÖ´Ù. Fred ÀÇ Å°´Â Á¤È®È÷ 2 ¹ÌÅÍÀε¥, 10 ¼¾Æ¼¹ÌÅÍÀÇ ³ª¹«ºí·Ï ¼¼ °³¸¦ ½×¾ÆµÎ°í ±× À§¿¡ ¿Ã¶ó¼­¸é, ±×ÀÇ ¸Ó¸®´Â ±×ÀÇ ¾ÆÆÄÆ® õÀå¿¡ ¹Ù·Î ´ê´Â´Ù. ÀÌ·¯ÇÑ Á¤º¸¸¦ ÀÌ¿ëÇÏ¿©, Fred ´Â (2.0 + (3 × 0.10)) ¶ó´Â ½ÄÀ» °è»êÇÏ¿© 2.3 À» ¾òÀ½À¸·Î½á, õÀåÀÇ ³ôÀ̸¦ °è»êÇÒ ¼ö ÀÖ¾ú´Ù.

Fred ´Â ¸Ó¸® ¼ÓÀ¸·Î, ¶Ç´Â °è»ê±â¸¦ ½á¼­, ¶Ç´Â °£´ÜÇÑ ÇÁ·Î±×·¥À» ÀÛ¼ºÇÔÀ¸·Î½á ÀÌ °á°ú¸¦ ½±°Ô °è»êÇÒ ¼ö ÀÖ´Ù. ¿ì¸®´Â ÀϹÝÀûÀÎ Áö½ÄÀ¸·ÎºÎÅÍ ÀÌ¿Í °°Àº ½ÄÀ» ±¸¼ºÇÏ°í, ±×°ÍÀ» °è»êÇؼ­ °á·ÐÀ» ³¾ ¼ö ÀÖ´Â ½Ã½ºÅÛÀ» ¸¸µé°íÀÚ ÇÑ´Ù. õÀåÀÇ ³ôÀ̸¦ ±¸ÇÏ´Â ¹®Á¦¿¡¼­¿Í °°ÀÌ ¾Ë°í ÀÖ´Â °ªÀ» ÀÌ¿ëÇÏ¿© ÃøÁ¤°ªÀ» ±¸ÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀ» ¿øÇϱ⠶§¹®¿¡ ¿ì¸®ÀÇ ¸ñÇ¥´Â ´Ü¼øÇÏÁö ¾Ê´Ù°í ÇÒ ¼ö ÀÖ´Ù.

2.0, 3, 0.10 Àº ±âÈ£ (symbol) ¿¡ ÇØ´çÇÏ°í ÀϹÝÀûÀ¸·Î ¼ýÀÚ¸¦ Ç¥ÇöÇÏ´Â µ¥ »ç¿ëµÈ´Ù. ¼ýÀÚ´Â "Ȧ¼ö" ¶Ç´Â "¦¼ö" ¿Í °°Àº Ư¼º°ú "°°´Ù" ¶Ç´Â "Å©´Ù" ¿Í °°Àº °ü°è, ±×¸®°í ¿ª½Ã ±âÈ£·Î Ç¥ÇöµÇ¸ç (3 × 0.10) °ú °°ÀÌ ±âÈ£ ¼ö½ÄÀ» ¸¸µå´Âµ¥ »ç¿ëµÇ´Â "´õÇϱâ" ¶Ç´Â "°öÇϱâ" ¿Í °°Àº Á¶ÇÕ ¹æ¹ýÀ» °¡Áö°í ÀÖ´Ù. ±âÈ£ ÇÁ·Î±×·¡¹Ö (symbolic programming) ¿¡¼­´Â ±âÈ£¿Í ±âÈ£½ÄÀ» ¸¸µé°í ±×°ÍÀ» Àμö·Î ÇÁ·Î½ÃÀú (procedure) ¿¡ º¸³»¸ç »õ·Î¿î ¼ö½ÄÀ» Ãß·ÐÇØ ³»±â À§Çؼ­ Á¶ÀÛÇÑ´Ù.

±âÈ£´Â ¼ýÀÚ ÀÌ¿ÜÀÇ ´Ù¸¥ °ÍÀ» Ãß·ÐÇϱâ À§ÇØ »ç¿ëµÉ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, Fred ´Â fred ¶ó´Â ±âÈ£·Î, ¼¼ °³ÀÇ Å丷Àº block1, block2, block3 À̶ó´Â ±âÈ£·Î ³ªÅ¸³¾ ¼ö ÀÖ´Ù. ÇÊ¿äÇÒ ¶§¸¶´Ù, ±âÈ£¸¦ À§ÇÑ Æ¯¼º, °ü°è, Á¶ÇÕ ¹æ¹ýµéÀ» Á¤ÀÇÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, (height fred) ¶ó´Â ¼ö½ÄÀº Fred ÀÇ Å°¸¦ ³ªÅ¸³»´Â °ÍÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖ°í, (on block1 block2) ´Â ÇϳªÀÇ Å丷ÀÌ ´Ù¸¥ Å丷 À§¿¡ ÀÖ´Ù´Â °ü°è¸¦ ³ªÅ¸³»´Â °ÍÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÁÖ¾îÁø ¼ö½Ä (on block1 block2) ¿Í (on block2 block3) ·Î ¼¼ °³ÀÇ Å丷À¸·Î ÀÌ·ç¾îÁø Å丷 ´õ¹Ì¶ó´Â »õ·Î¿î °ü°èÀÎ (stack block1 block2 block3) ¸¦ Ãß·ÐÇÒ ¼ö ÀÖ´Ù.

ÀÌ Àå¿¡¼­ ±âÈ£ ÇÁ·Î±×·¡¹ÖÀ» À§Çؼ­ ¼³°èµÈ Lisp (list processing language) ÇÁ·Î±×·¡¹Ö¿¡ °üÇÏ¿© ¼³¸íÇÑ´Ù. Lisp ´Â ±âÈ£¿Í ±âÈ£½Ä (symbolic expression) À» ´Ù·ç±â À§ÇÑ ±â´ÉµéÀ» ¸¹ÀÌ Æ÷ÇÔÇÏ°í ÀÖ´Ù. ¶ÇÇÑ ÇÁ·Î±×·¡¸Ó°¡ ÇϱÞÀÇ »ó¼¼ÇÑ ºÎºÐÀ¸·ÎºÎÅÍ ÀÚÀ¯·Î¿öÁú ¼ö ÀÖ°Ô µÇ¾îÀÖ´Ù. Lisp ÀÇ ±¸¹® (syntax) Àº °£´ÜÇϱ⠶§¹®¿¡ ¹è¿ì±â ½±°í ÇÁ·Î±×·¥Çϱ⵵ ½±´Ù.

ÀÌ Àå¿¡¼­´Â Àû¾îµµ Çϳª ÀÌ»óÀÇ ´Ù¸¥ ÇÁ·Î±×·¡¹Ö ¾ð¾î·Î ÇÁ·Î±×·¥ÇÏ´Â ¹æ¹ýÀ» ÀÌ¹Ì ¾Ë°í ÀÖ´Ù°í °¡Á¤ÇÑ´Ù. ¿ì¼±, ±âÈ£¿Í ±âÈ£½ÄÀÇ »ç¿ëÀ» À¯¹ßÇϱâ À§Çؼ­ ·Îº¿ ÇÁ·Î±×·¡¹Ö ¹®Á¦·ÎºÎÅÍ ½ÃÀÛÇØ º»´Ù. ¿ì¸®´Â ÀÌ ÀåÀÇ ¸¶Áö¸· ºÎºÐ¿¡¼­ ´Ù½Ã ÀÌ ¿¹·Î µ¹¾Æ¿Í¼­ ¾Õ Àý¿¡¼­ ¹è¿ü´ø °ÍÀ» »ç¿ëÇÏ¿© ±× ¹®Á¦¸¦ ÇØ°áÇÏ´Â Lisp Äڵ带 ÀÛ¼ºÇÒ °ÍÀÌ´Ù. Lisp ¿¡ ´ëÇÑ »çÇ×Àº ±âº»ÀûÀÎ ±¸¹®ÀÇ ¼Ò°³·ÎºÎÅÍ Lisp ¿¡¼­ »ç¿ëÇÒ ¼ö ÀÖ´Â ´ëÈ­ µµ±¸ÀÇ ¼Ò°³¸¦ ÇÏ°íÀÚ ¼³¸íÇÑ´Ù. ÀÌ·¯ÇÑ µµ±¸µéÀº Lisp ·Î ½±°Ô ½ÇÇèÇÒ ¼ö ÀÖ°Ô ÇØÁØ´Ù. ´Ù¸¥ ÇÁ·Î±×·¡¹Ö ¾ð¾î¿¡¼­ ¸¹ÀÌ »ç¿ëÇÏ´Â ±â¼ú »Ó¸¸ ¾Æ´Ï¶ó Àç±Í È£Ãâ°ú ¹Ýº¹ ±¸Á¶µµ ¼³¸íµÉ °ÍÀÌ´Ù. ¶ÇÇÑ ¸®½ºÆ®´Â ±âÈ£½ÄÀ» ´Ù·ç´Â µ¥ ±âº»ÀûÀÎ °ÍÀ̹ǷΠ¸®½ºÆ®¸¦ »ý¼ºÇÏ°í Á¶ÀÛÇÏ´Â ±â¼ú¿¡ ´ëÇؼ­µµ ÀÚ¼¼È÷ ¼³¸íÇÒ °ÍÀÌ´Ù. ¶ÇÇÑ °£´ÜÇÏÁö¸¸ ÀÚ·á Ãß»óÈ­ (data abstraction) ¿¡ ´ëÇÑ ¼³¸íµµ ÇÒ °ÍÀÌ´Ù.

ÀÌ Àå¿¡¼­ ¼³¸íÇÏ´Â Lisp ¸¦ »ç¿ëÇÏ´Â µ¥¿¡´Â º¹ÀâÇÑ ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ´Â µ¥¿¡ ÀÏ»óÀûÀ¸·Î ÇÊ¿äÇÑ ÀÔÃâ·Â, µð¹ö±ë (debugging), ¸ðµâÈ­ (modularity) µî¿¡´Â °ÅÀÇ ½Ã°£À» º¸³»Áö ¾ÊÀ» °ÍÀÌ´Ù. ÀÌ ÀåÀÇ ¼³¸íÀº Lisp ¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ¼Ò°³°¡ ¾Æ´Ï´Ù. ÇлýµéÀÌ °³³äÀ» ¼ÒÈ­ÇÏ°í ½ÇÇèÇÒ ¼ö ÀÖÀ» Á¤µµ·Î, ÇÁ·Î±×·¡¹ÖÀ» ÇÒ ¼ö ÀÖ´Â Lisp ÀÇ ±â´É¿¡¸¸ ÁýÁßÇÒ °ÍÀÌ´Ù. ¾ÕÀ¸·Î °è¼ÓµÉ ¿©·¯ ÆäÀÌÁö¿¡ °ÉÃļ­ ÀÛÀº ÇÁ·Î±×·¥µéÀ» ¸¹ÀÌ ÀÛ¼ºÇØ¾ß ÇÏ°í, ÀÌ Ã¥¿¡ ³ª¿Â ¿¹µéÀ» º¯Çü½ÃÄÑ°¡¸é¼­ ½ÇÇèÇØ¾ß ÇÒ °ÍÀÌ´Ù. °¡´ÉÇÏ´Ù¸é, Lisp °¡ ½ÇÇàµÇ´Â ÄÄÇ»ÅÍ ¾Õ¿¡ ¾É¾Æ¼­ ´ëÈ­µµ±¸¸¦ »ç¿ëÇϸ鼭 ½ÇÇèÇ϶ó. ÀÌ ÀåÀº ÇϳªÀÇ ¿¹¸¦ º¸ÀÓÀ¸·Î½á °á·ÐÀ» ¸ÎÀ» °ÍÀÌ´Ù.

1. ±ÔÄ¢±â¹Ý ¹ÝÀÀ ½Ã½ºÅÛÀÇ ¿¹

¾î¶² ȸ»ç°¡ »ç¹«½Ç ºôµù¿¡¼­ ¿ìÆí¹°À» ¹è´ÞÇÏ´Â ·Îº¿À» À§ÇÑ Á¦¾î ½Ã½ºÅÛÀ» °³¹ßÇÏ°í ÀÖ´Ù. ±×µéÀº ·Îº¿¿¡°Ô ÇÑ »ç¹«½Ç¿¡¼­ ´Ù¸¥ »ç¹«½Ç·Î À̵¿ÇÒ ¶§ ¾î¶² º¹µµ¸¦ »ç¿ëÇÒ °ÍÀΰ¡¸¦ ¾Ë¸®´Â »óÀ§±ÞÀÇ °èȹ ½Ã½ºÅÛ (planning system) À» ÀÌ¹Ì ÀÛ¼ºÇß´Ù. ¿ì¸®´Â ·Îº¿ÀÌ ½ÇÁ¦·Î ¹°°Çµé°ú ºÎµúÈ÷Áö ¾Ê°í ºôµùÀÇ º¹µµ¸¦ Áö³ª°¥ ¼ö ÀÖµµ·Ï ÇÏ´Â Á¦¾î ½Ã½ºÅÛ ºÎºÐ¿¡ °ü½ÉÀÌ ÀÖ´Ù. ·Îº¿ÀÌ º¹µµ¸¦ Áö³ª°¥ ¶§ ±æ¿¡ ÀÖ´Â »ç¶÷µé°ú »óÀÚµéÀ» ÇÇÇØ¾ß ÇÑ´Ù. ÀÌ °£´ÜÇÑ ÇൿÀº ±ÔÄ¢±â¹Ý ¹ÝÀÀ ½Ã½ºÅÛ (rule-based reactive system) ¿¡ ÀÇÇؼ­ »ý¼ºµÈ´Ù. ±× ½Ã½ºÅÛÀº ´ÙÀ½¿¡ ¹«¾ùÀ» ÇÒ °ÍÀΰ¡¸¦ °áÁ¤ÇÏ´Â ±âÈ£½ÄÀ¸·Î Ç¥ÇöµÇ´Â ±ÔÄ¢µéÀ» »ç¿ëÇϱ⠶§¹®¿¡ ±ÔÄ¢À» ±â¹Ý (rule-based) ÇÏ°í ÀÖ´Ù°í ÇÑ´Ù. ¶ÇÇÑ ±× ½Ã½ºÅÛÀ» ¹ÝÀÀ (reactive) ½Ã½ºÅÛÀ̶ó°í Çϴµ¥, ±×°ÍÀº ·Îº¿ÀÇ °¨°¢±â±â¿¡ ÀÇÇØ ÀÎÁöµÇ´Â ȯ°æÀÇ º¯È­¿¡ °ÅÀÇ Á÷Á¢ÀûÀ¸·Î ¹ÝÀÀÇϱ⠶§¹®ÀÌ´Ù. ¿ì¼± °¨°¢±â±â¿Í Á¦¾î¸¦ Ç¥ÇöÇÏ´Â µ¥¿¡ »ç¿ëµÇ´Â ±âÈ£µéÀ» ¼Ò°³ÇÑ´Ù.

°¨°¢±â±â¿Í °¨°¢±â±â°ªÀ» ±âÈ£·Î Ç¥ÇöÇϱâ

·Îº¿Àº Àå¾Ö¹°ÀÌ ±Ùó¿¡ ÀÖ´ÂÁö¸¦ °¨ÁöÇÒ ¼ö ÀÖÀ¸³ª, Àå¾Ö¹°ÀÇ ¸ð¾çÀ̳ª À§Ä¡¸¦ »ó¼¼È÷ ÆľÇÇÏÁö ¸øÇÏ´Â ¿©¼¸ °³ÀÇ °¨°¢±â±â¸¦ °¡Áö°í ÀÖ´Ù. ¸¸ÀÏ Àå¾Ö¹°ÀÌ °¨ÁöµÇ¸é, ±×°ÍÀÇ À§Ä¡´Â ±× ·Îº¿¿¡ °¡±îÀÌ Àְųª, ¶³¾îÁ® Àְųª, ¶Ç´Â ¾ÆÁÖ ¸Ö¸® ÀÖ´Ù´Â °ÍÀ¸·Î º¸°íµÈ´Ù. ÀÌ·¯ÇÑ ´ë·«ÀûÀÎ °ªÀº ·Îº¿ÀÌ Àå¾Ö¹°À» ºÎµúÈ÷Áö ¾Ê°í À̵¿ÇÏ´Â µ¥¿¡ ÃæºÐÇÏ´Ù.

 

±×¸² 1  À̵¿ ·Îº¿À» À§ÇÑ Àå¾Ö¹° °¨Áö °¨°¢±â±â

¿©¼¸ °³ÀÇ °¨°¢±â±â´Â ·Îº¿ ÁÖÀ§¿¡ ÀÖ´Â Àå¾Ö¹°¿¡ ´ëÇÑ Á¤º¸¸¦ Á¦°øÇÑ´Ù. ±× °¨°¢±â±âµéÀº ·Îº¿ÀÌ Ç×ÇØÇÏ°í Àå¾Ö¹°À» ÇÇÇÏ´Â °ÍÀ» µ½±â À§Çؼ­ ·Îº¿ ¾Õ¿¡ ¹«¾ùÀÌ Àִ°¡¿¡ ´ëÇØ º¸´Ù ¸¹Àº Á¤º¸¸¦ Á¦°øÇϵµ·Ï ¹èÄ¡µÇ¾î ÀÖ´Ù. ±âÈ£ forward, jright, jleft, right, left, rear ´Â ¿©¼¸ °³ÀÇ °¨°¢±â±â¸¦ ³ªÅ¸³»±â À§Çؼ­ »ç¿ëµÈ´Ù. °¢ °¨°¢±â±â´Â ·Îº¿ ÁÖÀ§ÀÇ Á¤ÇØÁø Áö¿ª¿¡ ÀÖ´Â Àå¾Ö¹°ÀÇ Á¸Àç¿¡ ´ëÇÑ º¸°í¿¡ Ã¥ÀÓÀÌ Àִµ¥, near, away ¶Ç´Â far Áß ÇϳªÀÇ °ªÀ» ¸®ÅÏÇÑ´Ù. ±×¸² 1a ´Â °¨°¢±â±âµéÀÇ ¹è¿­À» º¸¿©ÁÖ°í ÀÖ°í, ±×¸² 1b ´Â ±æÀ» ºÎºÐÀûÀ¸·Î ¸·°í ÀÖ´Â ¹° ³Ã°¢±â°¡ ÀÖ´Â ÇÑ »ç¹«½Ç ºôµùÀÇ º¹µµ¿¡ ÀÖ´Â ·Îº¿À» ¹¦»çÇÏ°í ÀÖ´Ù.

°¨°¢±â±â ¿Ü¿¡µµ, ·Îº¿ÀÇ ÇൿÀ» °áÁ¤ÇÏ´Â µÎ °³ÀÇ Á¦¾î ¸Å°³º¯¼ö (control parameter) °¡ ÀÖ´Ù. ÀÌµé ¸Å°³º¯¼ö¸¦ Á¶Á¤ÇÔÀ¸·Î½á ±ÔÄ¢±â¹Ý ¹ÝÀÀ ÇÁ·Î±×·¥Àº ·Îº¿¿¡°Ô ¾î¶»°Ô ¿òÁ÷¿©¾ß ÇÏ´ÂÁö¸¦ Áö½ÃÇÑ´Ù. ·Îº¿ÀÇ ¼Óµµ´Â speed ¶ó´Â ±âÈ£·Î Ç¥ÇöµÇ°í, zero, slow, fast ÀÇ ¼¼ °³ ÁßÀÇ ÇϳªÀÇ °ªÀ¸·Î ÁöÁ¤µÈ´Ù. ·Îº¿ÀÌ °¡´Â ¹æÇâÀº tum À̶ó´Â ±âÈ£·Î Ç¥ÇöµÇ°í left, straight, right Áß ÇϳªÀÇ °ªÀ¸·Î ÇÒ´çµÈ´Ù.

´ÙÀ½ Àý¿¡¼­´Â ±ÔÄ¢µéÀ» ±âÈ£½ÄÀ¸·Î Ç¥ÇöÇÏ°í, ÀÌ·¯ÇÑ ±ÔÄ¢µéÀ» »ç¿ëÇÏ¿© ·Îº¿À» Á¦¾îÇÏ´Â ÇÁ·Î½ÃÀú¸¦ ±¸ÇöÇÏ´Â ¹æ¹ýµéÀ» ¼Ò°³ÇÑ´Ù. ÀÌ ÀåÀÇ ¸¶Áö¸·¿¡ ÀÌ ¿¹·Î µ¹¾Æ¿Í¼­ °£´ÜÇÑ ±ÔÄ¢±â¹Ý ¹ÝÀÀ ½Ã½ºÅÛÀ» ±¸ÇöÇÏ´Â Lisp Äڵ带 Á¦°øÇÒ °ÍÀÌ´Ù.

2. Lisp ÀÇ ¼Ò°³

Lisp Àº ÇÁ·Î½ÃÀú¸¦ Á¤ÀÇÇÏ°í ´Ù¸¥ ÇÁ·Î½ÃÀú·ÎºÎÅÍ ±× ÇÁ·Î½ÃÀú¸¦ È£ÃâÇÒ ¼ö ÀÖ´Â Á¡¿¡¼­ Pascal À̳ª C ¿Í °°Àº ¾ð¾î¿Í ¿©·¯ ¸é¿¡¼­ Lisp ´Â ±×°ÍÀÌ º¸´Ù °£´ÜÇÑ ±¸¹®À» °¡Áö°í ÀÖ´Ù´Â °Í°ú, ÀÚ·á ÇüÅÂÀÇ ¸íÈ®ÇÑ ¿ä±¸°¡ Àû´Ù´Â °Í°ú, ¹Ì¸® ±¸ÇöµÇ¾î ÀÖ´Â ³»ºÎ ÇÁ·Î½ÃÀú (built-in procedure) °¡ ¸¹°í ÇÁ·Î±×·¥ °³¹ßÀ» À§ÇÑ ´ëÈ­ÀûÀΠȯ°æÀ» Á¦°øÇÑ´Ù´Â ¸é¿¡¼­ ´Ù¸¥ ¾ð¾î¿Í ´Ù¸£´Ù°í ÇÒ ¼ö ÀÖ´Ù. ÀϹÝÀûÀ¸·Î ÇÁ·Î±×·¡¸Ó°¡ Pascal ¿¡ ´ëÇؼ­ ¸»ÇÒ ¶§, Pascal ÇÁ·Î±×·¥À» ¼­¼úÇϱâ À§ÇÑ ¹®¹ýÀûÀÎ »çÇ×, ÄÄÆÄÀÏ·¯, ½ÇÇà Äڵ带 »ý¼ºÇϱâ À§ÇÑ °ü·ÃµÈ µµ±¸ ¸ðµÎ¸¦ ÁöĪÇÏ°í ÀÖ´Ù. ÇÁ·Î±×·¡¸Ó°¡ Lisp ¿¡ ´ëÇؼ­ ¸»ÇÒ ¶§¿¡´Â »ç¿ëÀÚ°¡ ÀÛ¼ºÇÑ Lisp¤ýÇÁ·Î±×·¥°ú ¸¹Àº ³»ºÎ ÇÁ·Î½ÃÀú¸¦ ¼­¼úÇÏ´Â ¹®¹ýÀûÀÎ »çÇ×°ú Lisp ÇÁ·Î±×·¥À» ÄÄÆÄÀÏÇÏ°í µð¹ö±ëÇÏ°í ´ëÈ­Çϱâ À§ÇÑ ¿©·¯ µµ±¸¸¦ ÁöĪÇÏ´Â °ÍÀÌ´Ù.

ÇÁ·Î±×·¡¹Ö ¾ð¾î ¿ä±¸»çÇ×

¿ì¼± ÇÁ·Î±×·¡¹Ö ¾ð¾î¿¡´Â ¹«¾ùÀÌ ÇÊ¿äÇÑ°¡¸¦ »ý°¢ÇØ º¸¸é¼­ Lisp ¿¡ ´ëÇÑ ¼Ò°³¸¦ ½ÃÀÛÇϵµ·Ï ÇÏÀÚ. ¼ýÀÚ, ¹®ÀÚ¿­, Æ÷ÀÎÅÍ µî°ú °°Àº ¸ðµç Ç¥ÁØ ÀÚ·áÇü, ±×·¯ÇÑ ÀÚ·á¿¡ °¡ÇÒ ¼ö ÀÖ´Â ¿¬»êµé, ¿¹¸¦ µé¾î ´õÇϱâ, °öÇϱâ, ¹®ÀÚ¿­ ºÙÀ̱â, Æ÷ÀÎÅÍ ÂѾư¡±â µîÀÌ ¿ä±¸µÈ´Ù. ±× ¿Ü¿¡´Â ¼ø¼­Ã³¸®, Á¶°ÇºÐ±â, ÇÁ·Î½ÃÀú È£ÃâÀ» Á¦°øÇÏ´Â Á¦¾î ±¸Á¶°¡ ÇÊ¿äÇÏ´Ù. ÆÄÀÏ°ú Å͹̳ΰú °°Àº Ç¥ÁØ ÀåÄ¡·ÎºÎÅÍ ÀÐ°í ¾²´Â ¹æ¹ýµéÀº ½ÇÁ¦ ÀÀ¿ëÀ» À§Çؼ­ À¯¿ëÇÒ °ÍÀÌ´Ù. ¸¶Áö¸·À¸·Î, ÇÁ·Î±×·¥À» ±¸Á¶È­Çϱâ À§ÇÑ ¹æ¹ý (¿¹¸¦ µé¾î, ¼­ºê·çƾ (subroutine) °ú ¸ðµâ (module)) °ú »õ·Î¿î Á¦¾î ±¸Á¶¿Í Ãß»óÀû ÀÚ·áÇü (abstract data type) À» À§ÇÑ ÀåÄ¡°¡ ÀÖ´Ù¸é º¹ÀâÇÑ ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ´Â µ¥ µµ¿òÀ» ÁÙ °ÍÀÌ´Ù.

Common Lisp

Lisp ¿¡´Â ¿©·¯ Á¾·ù°¡ ÀÖ´Ù. ÀÌ Ã¥¿¡¼­´Â Common Lisp ¶ó ºÒ¸®¿ì´Â Lisp ¸¦ »ç¿ëÇÑ´Ù. ¿ì¸®´Â ÈξÀ ´Ù¾çÇÑ ´Ù¸¥ Lisp µé ´ë½Å¿¡ Common Lisp ¸¦ ÀÌ¿ëÇϴµ¥, ±×°ÍÀº Common Lisp °¡ ÀϹÝÀûÀ¸·Î ¼ö¿ëµÉ ¼ö Àִ ǥÁØÀÌ µÇ¾ú±â ¶§¹®ÀÌ´Ù. ¿ì¸®´Â Common Lisp °¡ ºÎºÐÁýÇÕ¸¸À¸·Î °ü½É »çÇ×À» Á¦ÇÑÇÏ°í, ´Ù·ç´Â ´ëºÎºÐÀÇ °ÍÀ» ´Ù¸¥ Lisp µé¿¡µµ ¿ª½Ã Àû¿ëµÉ ¼ö ÀÖ´Â °ÍÀ¸·Î ÇÑ´Ù. ¿ì¸®°¡ ¼±ÅÃÇÑ Common Lisp ÀÇ Æ¯Á¤ ºÎºÐÁýÇÕÀº ÀÌ Ã¥¿¡ ÀÖ´Â ¿¹¿Í ¿¬½À¹®Á¦¸¦ À§ÇØ ÇÊ¿äÇÑ ¸ðµç ±â´ÉµéÀ» Æ÷ÇÔÇÏ°í, Lisp ¿¡ ´ëÇؼ­ ´õ ¹è¿ï ¼ö ÀÖµµ·Ï ÇÏ´Â ÁÁÀº ¹Ø°Å¸§À» Á¦°øÇÒ °ÍÀÌ´Ù. ÀÌ·¯ÇÑ ºÎºÐÁýÇÕÀ» »ç¿ëÇÒ ¼ö ÀÖµµ·Ï Çϱâ À§Çؼ­, ÀÌ Ã¥ÀÇ µÞºÎºÐ¿¡ ÀϹÝÀûÀÎ ±âÈ£ ÇÁ·Î±×·¡¹Ö ¿ë¾î, ÇÔ¼ö À̸§, Ư¼ö Çü½Ä (special form), Ư¼ö ¹®ÀÚ¿Í °°Àº Lisp Ç¥±â ¹æ¹ý¿¡ ´ëÇÑ À妽º¸¦ Æ÷ÇÔÇÏ¿´´Ù.

¸®½ºÆ®¿Í Lisp ÀÇ ±¸¹®

Lisp ÀÇ ¹®¹ýÀº ºñ±³Àû °£´ÜÇÏ´Ù. »ç½Ç, ¸Å¿ì °£´ÜÇؼ­ ¹®¹ýÀû Á¦¾àÀÌ ÈξÀ ¸¹Àº ¾ð¾î¿¡ Àͼ÷ÇÑ ÇÁ·Î±×·¥µé¿¡°Ô Lisp Àº ±¸Á¶ÀûÀ¸·Î º¸ÀÌÁö ¾ÊÀ» ¼öµµ ÀÖ´Ù. Lisp ¿¡¼­´Â ÇÁ·Î±×·¥°ú ÀÚ·á´Â ¸®½ºÆ®·Î Ç¥ÇöµÇ´Âµ¥, ÇϳªÀÇ ¸®½ºÆ®´Â ¿­¸° °ýÈ£, 0 °³ ÀÌ»óÀÇ Ç¥Çö½Ä (expression) Àº ´Ý´Â °ýÈ£·Î Ç¥ÇöµÈ´Ù.

Ç¥Çö½ÄÀº Lisp °´Ã¼ (¿¹¸¦ µé¾î, ¼ýÀÚ³ª ¹®ÀÚ¿­) À̰ųª, 0 °³ ÀÌ»óÀÇ Ç¥Çö½ÄÀ» Æ÷ÇÔÇÏ´Â ÇϳªÀÇ ¸®½ºÆ®¿¡ ÇØ´çÇÑ´Ù. ¿¹¸¦ µé¾î ( ), (1), (1 (2)) ´Â ¸ðµÎ ¸®½ºÆ®ÀÌ°í, ù¹ø° °ÍÀº °ø (empty ¶Ç´Â null) ¸®½ºÆ®ÀÌ´Ù. ¸®½ºÆ® (1) Àº ¼ýÀÚ 1 ÀÇ ÇϳªÀÇ Ç¥Çö½ÄÀ¸·Î ÀÌ·ç¾îÁ® ÀÖ´Ù. ¸®½ºÆ® (1 (2)) ´Â ¼ýÀÚ 1 °ú ¸®½ºÆ® (2) ÀÇ µÎ °³ÀÇ Ç¥Çö½ÄÀ¸·Î ÀÌ·ç¾îÁ® ÀÖ´Ù. ¿©±â¼­ Àá½Ã ÁÖ¸ñÇÏ°í ³Ñ¾î°¥ °ÍÀº ¸ðµç Ç¥Çö½ÄÀº Àß ±¸¼ºµÈ (well-formed) Lisp ÇÁ·Î±×·¥¿¡ ÇØ´çÇÑ´Ù´Â °ÍÀÌ´Ù.

¸®½ºÆ®´Â ÇÁ·Î±×·¡¹Ö ÀÛ¾÷ÀÇ ¸¹Àº º¯ÇüÀ» °£´ÜÇÏ°Ô ÇÏ´Â Æ÷ÀÎÅÍÀÇ Ãß»óÈ­¸¦ Á¦°øÇÑ´Ù. ¸¸ÀÏ ´ç½ÅÀÌ Æ÷ÀÎÅÍ¿¡ Àͼ÷ÇÏÁö ¾Ê´Ù¸é ±× Á¡Àº ¿°·ÁÇÏÁö ¾Ê¾Æµµ ÁÁ´Ù. Lisp ÀÇ ¸®½ºÆ®´Â Æ÷ÀÎÅ͸¦ ¼¼ºÎÀûÀ¸·Î Á¶ÀÛÇϵµ·Ï ¿ä±¸ÇÏÁö ¾Ê´Â´Ù.

¶ÇÇÑ ¼ýÀÚ (Á¤¼ö¿Í ½Ç¼ö), "string" °ú °°ÀÌ º¸Åë µÎ °³ÀÇ µû¿ÈÇ¥·Î Ç¥ÇöµÇ´Â ¹®ÀÚ¿­ ±×¸®°í ´Ù¾çÇÑ ¿ø½Ã ÀÚ·áÇüÀ» °¡Áö°í Àִµ¥, ¸®½ºÆ® Á¶ÀÛÀÇ ¿ëÀ̼ºÀÌ Lisp ÀÇ °¡Àå Áß¿äÇÑ Æ¯¼º ÁßÀÇ ÇϳªÀÌ´Ù.

±âÈ£ (symbol)

¶Ç ´Ù¸¥ Lisp ÀÇ Áß¿äÇÑ ÀÚ·áÇüÀº ±âÈ£ÀÌ´Ù. ±âÈ£´Â ¹®ÀÚ¿­°ú ¸Å¿ì ºñ½ÁÇÏ°Ô »ý°åÀ¸³ª µû¿ÈÇ¥·Î ¸¸µéÁö ¾Ê´Â´Ù. ±âÈ£µéÀº sym °ú sym4 ¿Í °°ÀÌ ¿µ¹®ÀÚ¿Í ¼ýÀڷκÎÅÍ ÀÌ·ç¾îÁö°í, sym_one °ú sym_two ¿Í °°ÀÌ ÇÏÀÌÇ°ú ¹ØÁÙ¼±ÀÌ Æ÷ÇԵDZ⵵ ÇÑ´Ù. Lisp ¿¡¼­ ¼ýÀÚ´Â ±âÈ£°¡ ¾Æ´Ï´Ù. µû¶ó¼­ ¸ðµç Lisp ±âÈ£´Â ¼ýÀÚ³ª ¼Ò¼öÁ¡ÀÌ ¾Æ´Ñ ¹®ÀÚ¸¦ Àû¾îµµ Çϳª´Â Æ÷ÇÔÇØ¾ß ÇÑ´Ù. ÀϹÝÀûÀ¸·Î ´ë¼Ò¹®ÀÚ ±¸º°Àº ÇÏÁö ¾Ê´Â´Ù. Áï, foo ´Â FOO ¶Ç´Â Foo ¿Í °°Àº ±âÈ£ÀÌ´Ù. ¸®½ºÆ®´Â ±âÈ£µéÀ» Æ÷ÇÔÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î (foo bar (baz)) ´Â foo, bar, (baz) ÀÇ ¼¼ °³ÀÇ ½ÄÀ¸·Î ±¸¼ºµÈ ¸®½ºÆ®ÀÌ´Ù.

ÇÁ·Î±×·¥°ú ¹®¼­È­

ÇϳªÀÇ Lisp ÇÁ·Î±×·¥Àº ¿¬¼ÓÀûÀÎ Lisp Ç¥Çö½ÄÀ¸·Î ÀÌ·ç¾îÁ® ÀÖ´Ù. ÀÌ Ã¥¿¡¼­´Â Lisp ÇÁ·Î±×·¥À» Çü½ÄÀ» °®Ãá Lisp Ç¥Çö½ÄÀ¸·Î Ç¥½ÃÇÏ°í, Ç¥Çö½ÄÀ» ¼³¸íÇÏ´Â ¹®ÀåÀ» °£°£ÀÌ »ðÀÔÇÏ¿© º¸¿©ÁÙ °ÍÀÌ´Ù. Lisp ÇÁ·Î±×·¥À» ±¸¼ºÇϸé ÆÄÀÏ·Î ÀúÀåÇØ¾ß ÇÒ °ÍÀÌ´Ù. ÆÄÀÏ·Î ÀúÀåµÈ ÇϳªÀÇ Lisp ÇÁ·Î±×·¥Àº ¿¬¼ÓÀûÀÎ Lisp ½Ä°ú ÇÁ·Î±×·¥À» Çؼ³ÇÏ´Â ÁÖ¼® (comment) À¸·Î ±¸¼ºµÇ¾î ÀÖ´Ù.

;; ÀÌ ÁÖ¼®Àº ¹Ù·Î ÇϳªÀÇ ½Ä ¾Õ¿¡ ³ªÅ¸³­´Ù.

(defun square (x)

     ;; ÁÖ¼®Àº ÇϳªÀÇ ½Ä ¾ÈÂÊ¿¡ ³ªÅ¸³¯ ¼öµµ ÀÖ´Ù.

     (* x x))   ;; ÁÖ¼®Àº ½Ä ¿À¸¥Æí¿¡ ³ªÅ¸³¯ ¼öµµ ÀÖ´Ù.

;; ÁÖ¼®Àº ½Ä¿¡ ´ëÇØ ÃæºÐÈ÷ Çؼ³Çϱâ À§Çؼ­,

;; ÇÊ¿äÇÑ ¸¸Å­ ¿©·¯ ÁÙ¿¡ °ÉÃļ­ ³ªÅ¸³¯ ¼ö ÀÖ´Ù.

(defun cube (x)

     (* x x x))   ;; ÁÖ¼® ¿À¸¥Æí¿¡ ÀÖ´Â ½ÄÀº ¹«½ÃµÈ´Ù! (+ x x x)

±×¸² 2  ÆÄÀÏ¿¡¼­¿Í °°ÀÌ ³ªÅ¸³ª°Ô µÉ ÁÖ¼®ÀÇ ¿¹

ÁÖ¼®Àº ÄÄÆÄÀÏ·¯³ª ´Ù¸¥ µµ±¸µéÀÌ ¹®ÀåÀ¸·ÎºÎÅÍ ÇÁ·Î±×·¥À» ºÐ¸®ÇÒ ¼ö ÀÖµµ·Ï Ưº°ÇÑ ±¸µÎ¹ýÀ¸·Î ºÐ¸®µÇ¾î ÀÖ´Ù. ¼¼¹ÌÄÝ·Ð (;) Àº Ç¥ÁØ ÁÖ¼® ¹®ÀÚÀÌ´Ù. ¼¼¹ÌÄÝ·ÐÀÇ ¿À¸¥ÂÊ °°Àº ÁÙ¿¡ ÀÖ´Â ¹®ÀÚµéÀº ±× ÆÄÀÏÀ» Àд Lisp µµ±¸¿¡ ÀÇÇؼ­ ¹«½ÃµÈ´Ù. ±¸µÎÁ¡ÀÇ ¸ñÀûÀ¸·Î »ç¿ëµÇ´Â °Í°ú Â÷º°È­ Çϱâ À§Çؼ­ º¸ÅëÀº ÁÖ¼®À» À§Çؼ­ µÎ °³ÀÇ ¼¼¹ÌÄÝ·Ð (;;) À» »ç¿ëÇÑ´Ù. ±×¸² 2 ´Â Lisp ÇÁ·Î±×·¥À» Æ÷ÇÔÇÏ°í ÀÖ´Â ÆÄÀÏ¿¡¼­ ÈçÈ÷ º¼ ¼ö ÀÖ´Â ÁÖ¼®ÀÇ ¿¹¸¦ º¸¿©ÁÖ°í ÀÖ´Ù.

3. Lisp ¿Í ´ëÈ­Çϱâ

Á»´õ ÁøÇàÇϱâ À§Çؼ­ Lisp ÀÇ Àǹ̿¡ ´ëÇؼ­ Á»´õ ¾Ë¾Æº¼ ÇÊ¿ä°¡ ÀÖ´Ù. ÀÌ°ÍÀº ÀüÅëÀûÀÎ ¾ð¾î¿¡¼­ ÄÄÆÄÀÏ, ¸µÅ· (linking), ±×¸®°í ÇÁ·Î±×·¥À» ½ÇÇàÇÏ´Â ¹æ¹ý¿¡ ÇØ´çÇÑ´Ù. ¿ì¸®´Â Lisp ¿¡¼­ ´Ù¸¥ Lisp ÇÁ·Î±×·¥À» Çؼ® (interpret) ÇÏ°í Æò°¡ (evaluate) ÇÏ´Â eval À̶ó´Â Lisp ÇÁ·Î±×·¥À» ÁýÁßÀûÀ¸·Î »ìÆ캼 °ÍÀÌ´Ù. Eval Àº ´Ù¸¥ ÇÁ·Î±×·¡¹Ö ¾ð¾î¿¡¼­ ÄÄÆÄÀÏ·¯°¡ ÇÏ´Â °Í°ú °°Àº ÀÏÀ» ÇÑ´Ù. Eval ·Î Lisp ÇÁ·Î±×·¥À» º¹ÀâÇÑ ¸µÅ·¾øÀÌ Á¡ÁøÀûÀ¸·Î ÄÄÆÄÀÏÇÒ ¼ö ÀÖ´Ù´Â »ç½ÇÀº, Lisp ÄÚµå·Î °£´ÜÇÏ°Ô ½ÇÇèÇÒ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù. Common Lisp Àº eval ¿¡ ÀÇÇÑ ÄÄÆÄÀÏ ¸»°íµµ ´Ù¸¥ ÄÄÆÄÀÏ Çüŵµ Á¦°øÇϴµ¥, ÀÌ Ã¥¿¡¼­´Â ±×°ÍÀ» ´Ù·çÁö ¾Ê°Ú´Ù.

Lisp Çؼ®±â

´ëºÎºÐÀÇ Lisp ½Ã½ºÅÛÀº »ç¿ëÀÚ·Î ÇÏ¿©±Ý Lisp ½ÄÀ» Å͹̳ο¡¼­ ÀÔ·ÂÇÏ°í eval À» ½ÇÇà½Ãų ¼ö ÀÖµµ·Ï ´ëÈ­ÀûÀÎ ÇÁ·Î±×·¥À» Á¦°øÇÏ°í ÀÖ´Ù. ÀÌ·¯ÇÑ ´ëÈ­ ÇÁ·Î±×·¥À» read-eval-print ·çÇÁ (loop) ¶ó°í ºÎ¸£´Âµ¥, ÀÌ°ÍÀÌ Å͹̳ηκÎÅÍ ÇϳªÀÇ ½ÄÀ» Àаí, ±× ½ÄÀ» Æò°¡ÇÏ°í, ±×¸®°í Æò°¡ÀÇ °á°ú¸¦ Å͹̳ηΠÃâ·ÂÇϸ鼭 ¶Ç ´Ù¸¥ ½ÄÀÇ ÀÔ·ÂÀ» ¿ä±¸Çϱ⠶§¹®ÀÌ´Ù. ¿ì¸®´Â Çؼ®±â (interpreter) ¶ó ºÎ¸£´Â ÀÌ·¯ÇÑ ´ëÈ­ÀûÀÎ ÇÁ·Î±×·¥À» ¾ÕÀ¸·Î °è¼Ó »ç¿ëÇÒ °ÍÀε¥, °¡´ÉÇÏ´Ù¸é Å͹̳Π¾Õ¿¡¼­ ÀÌ°ÍÀ» Á÷Á¢ ¼öÇàÇϸ鼭 µû¶ó¿À±â ¹Ù¶õ´Ù. ÁÖÀ§¿¡ ÀÖ´Â Lisp Àü¹®°¡¿¡°Ô Çؼ®±â¸¦ ¾î¶»°Ô ½ÇÇà½ÃÅ°°í ¿À·ù¸¦ ¾î¶»°Ô ±Øº¹ÇÏ´ÂÁö¸¦ ¹°¾î º¸¶ó. ½ÇÇèÇØ º¸´Â °ÍÀ» ¾î·Á¿öÇÏÁö ¸»¶ó. Çؼ®±â´Â ŽÇèÀ» µµ¿ÍÁÖµµ·Ï ¼³°èµÇ¾î ÀÖ´Ù.

Lisp Çؼ®±â°¡ ½ÇÇàµÇ¸é ÀϹÝÀûÀ¸·Î ¹öÀüÀ» ³ªÅ¸³»´Â ¼ýÀÚ, º¹Á¦¿¡ ´ëÇÑ Á¦ÇÑ »çÇ×, ±×¸®°í ÀÌ ´Ü°è¿¡¼­ ¹«½ÃÇÒ ¼ö ÀÖ´Â ´Ù¸¥ Á¤º¸¿¡ °üÇÑ ¿©·¯ ¸Þ½ÃÁö°¡ ÇÁ¸°Æ®µÈ´Ù. ÀÌ·¯ÇÑ Ã¹ Àλ簡 ³¡³ª¸é, ´ç½ÅÀÌ Å¸ÀÌÇÎÀ» ½ÃÀÛÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» ¾Ë¸®´Â ÇÁ·ÒÇÁÆ® (prompt) ¸¦ Ç¥½ÃÇÑ´Ù. Çؼ®±â´Â ÇϳªÀÇ ¿ÏÀüÇÑ ½ÄÀ» ±â´Ù¸°´Ù. ÀÌ·¯ÇÑ ½ÄÀ» ŸÀÌÇÎÇÑ ÈÄ¿¡ ¸®ÅÏÀ» Ä¡¸é Çؼ®±â´Â ±×°ÍÀ» Àаí, Æò°¡ÇÏ°í ±×¸®°í °á°ú¸¦ Ãâ·ÂÇÑ´Ù. ¿¹¸¦ µé¾î, Lisp ¿¡¼­ ¹®ÀÚ¿­°ú ¼ýÀÚ´Â ÀÚ±â ÀÚ½ÅÀ¸·Î Æò°¡µÈ´Ù.

±âÈ£¿Í ½ÄÀº ´Ù¸£°Ô Ãë±ÞµÈ´Ù. Çؼ®±â¿¡ ¾Æ¹« ±âÈ£³ª ÀÔ·ÂÇϸé, ¾Æ¸¶µµ ¿À·ù°¡ ¹ß»ýÇÒ °ÍÀÌ´Ù. ÀÌ Ã¥¿¡¼­ »ç¿ëÇÏ´Â Çؼ®±â´Â ¸ðµç ±âÈ£¸¦ ´ë¹®ÀڷΠǥ½ÃÇÏ´Â °Í¿¡ À¯ÀÇÇ϶ó. ÀÌ°ÍÀº ´ëºÎºÐÀÇ Lisp ½Ã½ºÅÛµéÀÌ »ç¿ëÇÏ´Â ¹æ¹ýÀÌ´Ù.

³ªÁß¿¡ ÇϳªÀÇ ±âÈ£°¡ Àü¿ª°ª (global value) À» °®´Â´Ù´Â °ÍÀÌ ¾î¶² ÀǹÌÀÌ°í ±×°ÍÀ» ¾î¶»°Ô ÁöÁ¤Çϴ°¡¸¦ ¸íÈ®È÷ ¼³¸íÇÒ °ÍÀÌ´Ù. ¿ì¼± Áö±ÝÀº, ¾î¶² ±âÈ£µéÀº Àü¿ª°ªÀ» °®´Â´Ù´Â °ÍÀ» ¾Æ´Â °Í¸¸À¸·Î ÃæºÐÇÏ´Ù. ƯÈ÷, t ¿Í nil À̶ó´Â ±âÈ£´Â Lisp ÀÇ ±âº» ºÎ¿ï°ª (default boolean value) Àε¥, ±×°ÍµéÀº ÀÚ±â ÀÚ½ÅÀ¸·Î Æò°¡µÈ´Ù. Lisp ¿¡¼­ t ´Â ºÎ¿ï Âü (boolean true) ¿¡ ÇØ´çÇÏ°í, nil Àº ºÎ¿ï °ÅÁþ (boolean false) ¿¡ ÇØ´çÇÑ´Ù. Nil °ú °ø ¸®½ºÆ® ( ) ´Â ÀÌ ÀåÀÇ µÞºÎºÐ¿¡¼­ ¼³¸íÇÏ°ÚÁö¸¸ °°Àº ±âÈ£ÀÌ´Ù.

ÁßøµÈ ¸®½ºÆ®´Â ¸®½ºÆ®ÀÇ °ýÈ£¸¦ ¿Ã¹Ù·Î ¸ÂÃß¾î¾ß Çϱ⠶§¹®¿¡ Ãʺ¸ÀÚ°¡ ÀÔ·ÂÇϱ⠾î·Á¿öÇÑ´Ù. ¿ì¸®´Â ¾ÕÀ¸·Î ´ç½ÅÀÌ Çؼ®±â¿Í ´ëÈ­ÇÏ´Â °Í¿¡ ´ëÇؼ­ µµ¿ò¸»À» ÁÖÁö ¾ÊÀ» °ÍÀÌ´Ù. ´ç½ÅÀº ÇÊ¿äÇÒ ¶§, ¸Å´º¾óÀ̳ª ¿·¿¡ ÀÖ´Â Lisp Àü¹®°¡¿¡°Ô Á¶¾ðÀ» ±¸Çϱ⠹ٶõ´Ù. ¾Æ¸¶µµ ´ç½ÅÀÇ Lisp ´Â ÀÚµ¿ÀûÀ¸·Î °ýÈ£¸¦ ¸ÂÃß°í, ÁÙ¸ÂÃã (indentation) À» Á¶ÀýÇÏ°í ±× ¹Û¿¡µµ Á»´õ »ý»êÀûÀÎ ±â´ÉÀ» Æ÷ÇÔÇÏ°í ÀÖÀ» °ÍÀÌ´Ù.

4. Lisp ¿¡¼­ÀÇ ÇÔ¼ö

¸¸ÀÏ Çؼ®±â¿¡ ÀÔ·ÂµÈ ½ÄÀÌ ¹®ÀÚ¿­, ¼ýÀÚ, ±âÈ£ ¶Ç´Â ´Ù¸¥ ¿ø½Ã °´Ã¼°¡ ¾Æ´Ï¸é, ±×°ÍÀº ¸®½ºÆ®À̾î¾ß ÇÑ´Ù. ±×°ÍÀÌ ¸®½ºÆ®¶ó¸é Ư¼ö Çü½Ä (special form) À̰ųª, ÇϳªÀÇ ÇÔ¼ö¸¦ È£ÃâÇϴ ǥÇö½ÄÀ̾î¾ß ÇÑ´Ù. ¿ì¸®´Â ÀÌ Ã¥¿¡¼­ ÇÔ¼ö¶ó´Â ¿ë¾î¿Í ÇÁ·Î½ÃÀú¶ó´Â ¿ë¾î¸¦ °°ÀÌ »ç¿ëÇÑ´Ù. Ư¼ö Çü½ÄÀº Á¶°Ç¹®°ú Lisp ¿¡ ÀÇÇØ Æ¯º°È÷ ´Ù·ç¾îÁö´Â Á¦¾î ±¸Á¶ÀÇ È帧À» ¸»ÇÑ´Ù.

ÇÔ¼ö´Â ±âÈ£¸¦ ÇÔ¼ö¿¡ ´ëÀÀ½ÃÅ°´Â ÇϳªÀÇ Àü¿ª Å×À̺í (global table) ¿¡ ÀúÀåµÇ¾î ÀÖ´Ù°í °¡Á¤ÇÑ´Ù. ½ÇÁ¦ Common  Lisp ÀÇ °æ¿ì¿¡ ²À ±×·¸°Ô µÇ¾î¾ß ÇÒ ÇÊ¿ä´Â ¾ø´Ù. ±×·¯³ª ÀÌ·¸°Ô °¡Á¤ÇÏ¸é ¼³¸íÀ» ½±°Ô ÇÒ ¼ö ÀÖ´Ù. Eval Àº ÇÔ¼öÀÇ È£ÃâÀ» ´Ù·ç±â À§Çؼ­ ¶Ç ´Ù¸¥ Lisp ÇÁ·Î±×·¥ÀÎ apply ¸¦ »ç¿ëÇÑ´Ù. Apply ´Â µÎ °³ÀÇ Àμö¸¦ ÃëÇϴµ¥, ÇϳªÀÇ ÇÔ¼ö¿Í 0 °³ ÀÌ»óÀÇ Àμö·Î ÀÌ·ç¾îÁø ¸®½ºÆ®¸¦ ÃëÇÑ´Ù. Eval °ú apply ´Â ´ÙÀ½°ú °°ÀÌ ÇÔ²² µ¿ÀÛÇÑ´Ù.

¾ÕÀÇ ¼³¸íÀº ÇÔ¼ö È£ÃâÀ» À§ÇÑ Ä¡È¯¸ðµ¨ (substitution model) À̶ó°í ºÎ¸¥´Ù. ġȯ¸ðµ¨¿¡¼­ ÇÔ¼öÀÇ È£ÃâÀ̶õ ±× ÇÔ¼ö Á¤ÀÇÀÇ º¹»çº»¿¡ ÀÖ´Â Çü½Ä ¸Å°³º¯¼ö¸¦ °ªÀ¸·Î ġȯÇÏ°í ±× °á°ú·Î »ý±ä ½ÄÀ» Æò°¡ÇÏ´Â °ÍÀÌ´Ù. ÀÌÁ¦ Lisp °¡ ¾î¶»°Ô ÇÔ¼ö È£ÃâÀ» ´Ù·ç´ÂÁö¸¦ ¾Ë¾Æº¸¾ÒÀ¸´Ï È£ÃâÇÒ ÇÔ¼öµéÀ» ¾Ë¾Æº¸ÀÚ.

ÇÔ¼ö È£Ãâ

Common Lisp ´Â ³»ºÎ ÇÔ¼ö (built-in function) ¸¦ ¸¹ÀÌ °¡Áö°í ÀÖ´Ù. ÇÔ¼ö°¡ ¾î¶² °ÍÀÌ ÀÖ´ÂÁö¸¦ ´ëÃæ ¾Ë¾Æº¸±â À§Çؼ­ ÂüÁ¶ ¸Å´º¾ó (Steele [1990]) À» ÈÈ¾î º¼ ¼ö ÀÖ´Ù. ³Î¸® »ç¿ëµÇ°í ÀÖ´Â ´Ù¸¥ ÇÁ·Î±×·¡¹Ö ¾ð¾î¿¡¼­ ãÀ» ¼ö ÀÖ´Â ÇÔ¼öµéÀº ´ëºÎºÐÀº Common Lisp ¿¡¼­µµ ¾î¶°ÇÑ ÇüÅ·εç ãÀ» ¼ö ÀÖ´Ù. ¼ö½Ä ¿¬»ê¿¡ ´ëÇؼ­ Common Lisp ´Â Çϳª ÀÌ»óÀÇ Àμö¸¦ ¼ö¹ÝÇÏ´Â ´õÇϱâ (+), »©±â (-), °öÇϱâ (*), ³ª´©±â (/) ¿¡ ´ëÇÑ ÇÔ¼öµéÀ» Æ÷ÇÔÇÏ°í ÀÖ´Ù. À̵é ÇÔ¼ö´Â Á¤¼ö¿Í ½Ç¼öÀÇ ¾î¶°ÇÑ È¥ÇÕµµ ÇÕ¸®ÀûÀ¸·Î ¼öÇàÇÒ ¼ö ÀÖµµ·Ï °í·ÁµÇ¾ú´Ù. ´ÙÀ½Àº ¼¼ °³ÀÇ ¼ö¸¦ ´õÇÏ´Â ¿¹¿Í 4 ·ÎºÎÅÍ 2 ¿Í 1 ¸¦ »©´Â ¿¹¸¦ º¸ÀÌ°í ÀÖ´Ù.

 

±×¸² 3  ÁßøµÈ ÇÔ¼öÀÇ Æò°¡ ¼ø¼­

ÇϳªÀÇ ÇÔ¼ö È£Ãâ¿¡ ÇØ´çÇÏ´Â ¸®½ºÆ®¸¦ Æò°¡ÇÒ ¶§ Àμö´Â ¿ÞÂÊ¿¡¼­ ¿À¸¥ÂÊÀÇ ¼ø¼­·Î Æò°¡µÈ´Ù. ÁßøµÈ ÇÔ¼ö È£Ãâ ½ÃÀÇ Æò°¡ ¹æ¹ýÀº °¡Àå ±íÀº °÷¿¡ ÀÖ´Â Àμö¸¦ ¸ÕÀú Æò°¡ÇÏ´Â ¹æ½ÄÀ¸·Î ÀÌ·ç¾îÁö°Ô µÈ´Ù. ±×¸² 3 Àº ´ÙÀ½ È£Ãâ·ÎºÎÅÍ ±âÀÎÇÏ´Â Æò°¡ Æ®¸® (evaluation tree) ¸¦ º¸¿©ÁÖ°í ÀÖ´Ù. ºÎ Ç¥Çö½Ä (subexpression) ÀÇ Æò°¡ ¼ø¼­´Â [ ] ¿¡ ÀÖ´Â ¼ýÀڷΠǥ½ÃµÇ¾î ÀÖ´Ù.

ºÎ Ç¥Çö½ÄÀ» ÀûÀýÈ÷ ÁÙ¸ÂÃã (indentation) ÇÔÀ¸·Î½á Æò°¡Æ®¸®¸¦ È®½ÇÇÏ°Ô º¸ÀÏ ¼ö ÀÖ´Ù.

Lisp ±¸¹®Àº ÇÁ·Î±×·¥ÀÇ ±¸Á¶¸¦ ¸íÈ®ÇÏ°Ô Çϵµ·Ï °­¿äÇÏÁö´Â ¾Ê´Â´Ù. ÀÎÅÙÅ×À̼ÇÀº ÇÁ·Î±×·¥ÀÇ ±¸Á¶¸¦ ³ªÅ¸³»´Â µ¥ ¼±ÅÃÀûÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù.

¼øÂ÷ÀûÀÎ Ãß»óÈ­

ÇÔ¼ö´Â defun À̶ó´Â Ư¼ö Çü½Ä (special form) À» »ç¿ëÇÏ¿© Á¤ÀǵǴµ¥, defun Àº ÇÔ¼öÀÇ À̸§À» ³ªÅ¸³»´Â ±âÈ£¿Í ±× ÇÔ¼öÀÇ Çü½Ä ¸Å°³º¯¼ö (formal parameter) ¿¡ ÇØ´çÇÏ´Â ±âÈ£µéÀÇ ¸®½ºÆ®¿Í Çϳª ÀÌ»óÀÇ ½ÄÀ¸·Î Á¤ÀǵǾî ÀÖ´Ù. Defun Àº ÁÖ¾îÁø À̸§À¸·Î Àü¿ª Å×ÀÌºí¿¡ ÇÔ¼ö¸¦ Á¤ÀÇÇÑ´Ù. ÇÔ¼ö Á¤ÀÇ·Î ÇÁ·Î½ÃÀú¸¦ ¼­¼úÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, ( * 3 3) Àº ¼ýÀÚ 3 ÀÇ Á¦°öÀ» °è»êÇÑ´Ù. ´ÙÀ½°ú °°ÀÌ defun À» »ç¿ëÇÏ¿© ÀÓÀÇÀÇ ¼ýÀÚÀÇ Á¦°öÀ» ±¸ÇÏ´Â ÇÁ·Î½ÃÀú¸¦ Á¤ÀÇÇÒ ¼ö ÀÖ´Ù.

> (defun square (x) (* x x))
SQUARE
> (square 3)
9

Eval ÀÌ (square 3) À̶ó´Â ½ÄÀ» ¸¸³ª¸é ±× ½ÄÀÌ ÇÔ¼ö È£ÃâÀ̶ó´Â °ÍÀ» °áÁ¤ÇÏ°í square ¿Í Àμö ¸®½ºÆ®ÀÎ (3) À» apply ¿¡ º¸³½´Ù. Apply ´Â Àü¿ª Å×ÀÌºí¿¡¼­ square ¿¡ ´ëÇÑ Á¤ÀǸ¦ ã´Â´Ù. ÀÌ °æ¿ì¿¡ ±× Á¤ÀÇ´Â (* x x) ÀÌ´Ù. Apply ´Â eval À» »ç¿ëÇÏ¿© ´Ü ÇϳªÀÇ Àμö¸¦ Æò°¡ÇÏ¿© 3 À» ¾ò°í, (* x x) ¿¡¼­ x ¸¦ ġȯÇÏ¿© (* 3 3) ¸¦ ¾ò°í ´Ù½Ã ±× ½ÄÀ» Æò°¡Çϱâ À§Çؼ­ eval ·Î º¸³½´Ù.

;; Hypotenuse ´Â Á÷»ç°¢ÇüÀÇ µÎ º¯¿¡ ´ëÇÑ ±æÀÌ¿¡

;; ÇØ´çÇÏ´Â µÎ °³ÀÇ Àμö¸¦ ÃëÇÏ°í,

;; Á÷°¢»ï°¢ÇüÀÇ ºøº¯ÀÇ ±æÀ̸¦ ¸®ÅÏÇÑ´Ù.

(defun hypotenuse (a b)

     ;; Sqrt Àº ÀÓÀÇÀÇ ¼öÀÇ Á¦°ö±ÙÀ» °è»êÇÏ´Â

     ;; ³»ºÎ ÇÔ¼öÀÌ´Ù.

     (sqrt (+ (square a)

                (square b))))

;; Square ´Â ÀμöÀÇ Á¦°öÀ» °è»êÇÑ´Ù.

(defun square (x)

     (* x x))

±×¸² 4  ÆÄÀÏ¿¡¼­¿Í °°ÀÌ ³ªÅ¸³ª°Ô µÉ ÇÔ¼öÀÇ Á¤ÀÇ

±×¸² 4 ´Â µÎ °³ÀÇ ÇÔ¼ö Á¤ÀǸ¦ ÁÖ¼® (comment) ÀÇ ÇüÅ·ΠÇؼ³ÇÏ°í ÀÖ´Ù. hypotenuse °¡ ÆÄÀÏ ¾È¿¡¼­ square ÀÇ Á¤ÀÇ°¡ ³ªÅ¸³ª±â Àü¿¡ square ¸¦ ÂüÁ¶ÇÏ°í ÀÖÀ½À» ÁÖÀÇÇ϶ó. ½ÇÁ¦·Î È£ÃâµÇ±â Àü¿¡ ÇÔ¼ö°¡ Á¤Àǵȴٸé, ÆÄÀÏ ¾È¿¡¼­ ¾î¶°ÇÑ ¼ø¼­·Î ³ªÅ¸³ªµµ µÈ´Ù.

Á¶°Ç¹®

Lisp ´Â Á¦¾îÀÇ È帧À» À§ÇØ Æí¸®ÇÑ if ¹®ÀÇ Çü½ÄÀ» Á¦°øÇÏ°í ÀÖ´Ù. Lisp ÀÇ if ¹®Àº (if test conditional alternate) ÀÇ ÇüÅÂÀε¥, ¸¶Áö¸·ÀÇ alternate ´Â ¼±Åà »ç¾çÀÌ´Ù. eval ÀÌ if ¹®À» ¸¸³ª¸é test ½ÄÀÌ Áï°¢ Æò°¡µÈ´Ù.

Lisp ¿¡¼­ ¸ðµç ½ÄÀº ÇϳªÀÇ Å×½ºÆ® ±â´ÉÀ» ÇÑ´Ù. ¸¸ÀÏ ½ÄÀÌ nil (¶Ç´Â ( )) ¸¦ ¸®ÅÏÇϸé, ±× Å×½ºÆ®´Â ½ÇÆжó°í ¸»ÇÏ°í ±×·¸Áö ¾ÊÀ¸¸é ¼º°øÀ̶ó°í ¸»ÇÑ´Ù. ¿¹¸¦ µé¾î, Lisp ÀÇ ¼ú¾î (predicate) ÀÎ =, >, <, >= ´Â ¼öÄ¡Àû °ü°è¸¦ Å×½ºÆ®ÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù. Numberp ´Â ±×°ÍÀÇ Àμö°¡ ¼ýÀÚÀÎÁö¸¦ Å×½ºÆ®ÇÏ°í, symbolp ´Â ±âÈ£Àΰ¡¸¦ Å×½ºÆ®¸¦ ÇÑ´Ù. If ¹®¿¡¼­ conditional ½ÄÀº ±× Å×½ºÆ®°¡ ¼º°øÀûÀ̾úÀ» ¶§¸¸ Æò°¡µÇ°í, alternate ½ÄÀº ±× Å×½ºÆ®°¡ ½ÇÆÐÇßÀ» ¶§¸¸ Æò°¡µÈ´Ù.

ÇÔ¼ö next-odd-number ´Â Àμö·Î ÁöÁ¤µÈ Á¤¼öÀÇ ´ÙÀ½À¸·Î ¿À´Â Ȧ¼ö¸¦ ¸®ÅÏÇÑ´Ù. Next-odd-number ´Â ±×°ÍÀÇ Àμö°¡ ¦¼öÀΰ¡¸¦ Å×½ºÆ®Çϱâ À§Çؼ­ evenp ¸¦ »ç¿ëÇÑ´Ù. ¶ÇÇÑ È¦¼öÀÎÁö¸¦ Å×½ºÆ®ÇÏ´Â oddp ¶ó´Â ÇÔ¼ö°¡ ÀÖ´Ù.

¿ì¸®´Â or, and, not ÀÇ ºÎ¿ï ¿¬»êÀÚ (boolean operator) ¸¦ »ç¿ëÇÏ¿© º¸´Ù º¹ÀâÇÑ Å×½ºÆ®¸¦ ¸¸µé ¼ö ÀÖ´Ù.

not À̶ó´Â ¿¬»êÀÚ´Â Çϳª·Î ÀÌ·ç¾îÁø Àμö°¡ nil ·Î Æò°¡µÉ ¶§ t ¸¦ ¸®ÅÏÇÏ°í, ±×·¸Áö ¾ÊÀº °æ¿ì¿¡´Â nil À» ¸®ÅÏÇÑ´Ù. and ¶ó´Â ¿¬»êÀÚ´Â ÀÓÀÇÀÇ ¼öÀÇ Àμö¸¦ ¹Þ¾Æ¼­ ¸ðµç Àμö°¡ nil ÀÌ ¾Æ´Ò °æ¿ì¿¡´Â ¸¶Áö¸· ÀμöÀÇ °ªÀ» ¸®ÅÏÇÏ°í ±×·¸Áö ¾ÊÀ» ¶§¿¡´Â nil À» ¸®ÅÏÇÑ´Ù. or À̶ó´Â ¿¬»êÀÚ´Â ÀÓÀÇÀÇ ¼öÀÇ Àμö¸¦ ¹Þ¾Æ¼­ nil ÀÌ ¾Æ´Ñ ù¹ø° ÀμöÀÇ °ªÀ» ¸®ÅÏÇÏ°í ¸ðµç Àμö°¡ nil ÀÏ °æ¿ì¿¡´Â nil À» ¸®ÅÏÇÑ´Ù.

Lisp ´Â ¶ÇÇÑ º¸´Ù ÀϹÝÀûÀÎ Á¶°Ç¹®À» Á¦°øÇÏ°í ÀÖ´Ù. cond ¹®Àº (cond clause1, clause2 ...) ¶ó´Â Çü½ÄÀ» ÃëÇϴµ¥, ¿©±â¼­ clause µéÀº (test body) ÀÇ Çü½ÄÀ¸·Î µÇ¾î ÀÖ°í, body ´Â 0 °³ ÀÌ»óÀÇ ½ÄÀ¸·Î ±¸¼ºµÇ¾î ÀÖ´Ù. cond ¹®Àº ±×°ÍÀÇ °¢ clause ÀÇ test ¸¦ ±× Áß Çϳª°¡ ¼º°øÇÒ ¶§±îÁö Â÷·Ê·Î Æò°¡ÇÑ´Ù. ¼º°øÀÌ µÇ¸é, ±× clause ÀÇ body ¿¡ ÀÖ´Â ½ÄµéÀÌ ¼ø¼­´ë·Î Æò°¡µÇ°í, ¸¶Áö¸· ½ÄÀÇ °ªÀÌ ±× cond ¹®ÀÇ °ªÀ¸·Î¼­ ¸®ÅϵȴÙ. ¸¸ÀÏ clause °¡ body ¿¡ ¾Æ¹« ½ÄÀ» °¡Áö°í ÀÖÁö ¾ÊÀ¸¸é test ÀÇ °ªÀÌ ¸®ÅϵȴÙ. test °¡ ÂüÀÌ ¾Æ´Ï¸é, ±× cond ´Â nil ¸¦ ¸®ÅÏÇÑ´Ù.

´ÙÀ½¿¡ 49 º¸´Ù ÀÛÀº ¼ö°¡ ¼Ò¼öÀÎÁö¸¦ Å×½ºÆ®ÇÏ´Â primep ¶ó´Â ¼­¼úÇü ¸íÁ¦¸¦ Á¤ÀÇÇÑ´Ù. Primep ´Â ÁÖ¾îÁø ¼ýÀÚ°¡ ¹üÀ§¸¦ ¹þ¾î³¯ ¶§¿¡ princ ¶ó´Â Lisp ÇÁ¸°Æ® ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù. princ ¶ó´Â ÇÔ¼ö´Â ÇϳªÀÇ Àμö¸¦ Æò°¡ÇÏ¿© ±× °á°ú°ªÀ» ÇÁ¸°Æ®ÇÏ°í ±× °ªÀ» ¸®ÅÏÇÑ´Ù. Primep ´Â ¶ÇÇÑ Lisp ÀÇ ³ª¸ÓÁö (modulo) ÇÔ¼öÀÎ mod ¸¦ »ç¿ëÇÏ¿© ¼ýÀÚ°¡ 2, 3 ¶Ç´Â 5 ¿¡ ÀÇÇؼ­ ³ª´©¾îÁú ¼ö ÀÖ´ÂÁö¸¦ °áÁ¤ÇÑ´Ù.

ÇÔ¼ö primep ¿¡¼­ t (ÀÚ½ÅÀ» Æò°¡ÇÏ´Â ÇϳªÀÇ ±âÈ£) ´Â Ç×»ó ¼º°øÇÏ´Â Å×½ºÆ®ÀÇ ¿ªÇÒÀ» ÇÑ´Ù. ¾î¶² Å×½ºÆ®µµ ¼º°øÇÏÁö ¾Ê´Â cond ¹®À» ÀÛ¼ºÇÏ´Â °ÍÀº ¾È ÁÁÀº ÇüŶó°í »ý°¢ÇÑ´Ù. µû¶ó¼­, Á¾Á¾ ¸¶Áö¸· clause °¡ (t body) ÀÇ ÇüÅÂÀÎ cond ¹®À» º¸°Ô µÉ °ÍÀÌ´Ù.

Àç±ÍÇÔ¼ö

Àç±ÍÀûÀÎ (recursive) ¹®Á¦ÇØ°á ¹æ¹ýÀº ÁÖ¾îÁø ¹®Á¦¸¦ Çϳª ÀÌ»óÀÇ º¸´Ù °£´ÜÇÑ ¹®Á¦µé·Î ÁÙÀÌ°í, ±× °£´ÜÇÑ ¹®Á¦µéÀ» ÇØ°áÇϱâ À§Çؼ­ ÀÚ±â ÀÚ½ÅÀ» Àû¿ëÇÑ´Ù. ±×°ÍÀº ¹®Á¦°¡ ´õ ÀÌ»ó ÁÙ¿©ÁöÁö ¾ÊÀ» ¶§±îÁö ½±°Ô ÇØ°áµÉ ¼ö ÀÖ´Â ¹®Á¦µéÀÇ Á¶°¢À¸·Î °è¼ÓÇؼ­ ³ª´«´Ù. ÀÌ·¯ÇÑ ¹æ½ÄÀ¸·Î µ¿ÀÛÇÏ´Â ÇÔ¼ö¸¦ Á¤ÀÇÇÒ ¼ö ÀÖ´Ù.

ÀÌ Ã¥¿¡¼­ ¼­¼úÇÏ´Â ¸¹Àº ÇÔ¼öµéÀº Àç±ÍÀûÀ¸·Î Á¤ÀǵǾî ÀÖ´Ù. Àç±ÍÇÔ¼ö (recursive function) ¶õ ±× ÇÔ¼ö°¡ ±×°ÍÀÇ Á¤ÀÇ ºÎºÐ¿¡¼­ Àç±ÍÀûÀ¸·Î È£ÃâµÇ´Â ÇÔ¼ö¸¦ ¸»ÇÑ´Ù. Àç±Í È£Ãâ¿¡¼­´Â ÀϹÝÀûÀ¸·Î ¿ø·¡ÀÇ ÀμöÀÇ Å©±â¸¦ Á¡Á¡ ÁÙ¿©°¡¸é¼­ ¹®Á¦¸¦ ÇØ°áÇÑ´Ù. °¢ Àç±Í È£ÃâÀº º£À̽º ÄÉÀ̽º (base-case) ¶ó´Â ÆǴܱâÁØÀÌ ¸¸Á·ÇÒ ¶§±îÁö °è¼ÓÇؼ­ ¹®Á¦¸¦ ÁÙ¿©³ª°£´Ù.

ÇÔ¼ö raise ´Â ÇϳªÀÇ ¼ýÀÚ¿Í À½ÀÌ ¾Æ´Ñ Á¤¼ö n ÀÇ µÎ °³ÀÇ Àμö¸¦ ÃëÇÏ°í, n Á¦°öÀ¸·Î °è»êµÈ ¼ö¸¦ ¸®ÅÏÇÑ´Ù. ±×°ÍÀÇ Àç±ÍÇÔ¼ö´Â ´ÙÀ½°ú °°´Ù.

Àç±Í È£ÃâÀ» À§ÇÑ º£À̽º ÄÉÀ̽º (base-case) ÆǴܱâÁØ, Áï ³¡³»´Â Á¶°ÇÀº n = 0 ÀÎ °æ¿ìÀÌ´Ù. ¸ðµç ¼öÀÇ 0 Á¦°öÀº 1 ÀÌ´Ù. ¸¸ÀÏ n ÀÌ 0 ÀÌ ¾Æ´Ï¶ó¸é, x ¿Í (-n 1) À¸·Î ÀÌ·ç¾îÁø Àμö·Î raise ¸¦ È£ÃâÇÑ °á°ú¸¦ x ¿¡ °öÇÑ´Ù.

¾ÕÀ¸·Î Àç±ÍÇÔ¼öÀÇ ¿¹¸¦ ¸¹ÀÌ Á¦½ÃÇÒ °ÍÀÌ´Ù. ¶ÇÇÑ Àç±Í È£ÃâÀÌ ¾î»öÇÑ °æ¿ì¸¦ À§Çؼ­ ¹Ýº¹ ±¸Á¶ (iterative construct) ¿¡ ´ëÇÑ ¼Ò°³¸¦ ÇÒ °ÍÀÌ´Ù.

ÆÄÀÏ¿¡ ÀÖ´Â ÇÔ¼öÀÇ Æò°¡

ÀÌÁ¦, ÇÔ¼ö¸¦ ÀÛ¼ºÇÒ ¼ö ÀÖ°Ô µÇ¾úÀ¸´Ï ¾Æ¸¶µµ ±×µé Áß ¾î¶² °ÍÀ» Lisp Çؼ®±â¿¡¼­ ¹Ýº¹ÀûÀ¸·Î ŸÀÌÇÎÇÏÁö ¾Ê¾Æµµ µÇµµ·Ï ÆÄÀÏ¿¡ ÀúÀåÇÏ°í ½ÍÀ» °ÍÀÌ´Ù. ÇϳªÀÇ Lisp ÇÁ·Î±×·¥¿¡ ÀÖ´Â ¿¬¼ÓµÈ Lisp ½Äµé·Î º¼ ¼ö ÀÖ´Ù. Lisp ÇÁ·Î±×·¥À» ½ÇÇàÇÏ´Â °ÍÀº ÇÁ·Î±×·¥¿¡ ÀÖ´Â ½ÄµéÀ» ³ªÅ¸³ª´Â ¼ø¼­´ë·Î Æò°¡ÇÏ´Â °ÍÀ¸·Î ÀÌ·ç¾îÁø´Ù. ¸¸ÀÏ ¿©·¯ °³ÀÇ ½ÄÀ» ÇϳªÀÇ ÆÄÀÏ¿¡ ÀÛ¼ºÇß´Ù¸é, Lisp Çؼ®±â·ÎºÎÅÍ ±× ÆÄÀÏÀ» ·Îµù (loading) ÇÔÀ¸·Î½á ½ÇÇà½Ãų ¼ö ÀÖ´Ù. ·ÎµùÀº (load file-specification) À̶ó´Â ÇüÅÂÀÇ ½ÄÀ» Æò°¡ÇÔÀ¸·Î½á ÀÌ·ç¾îÁö´Âµ¥, file-specification Àº ÇϳªÀÇ ÆÄÀÏÀ» ÁöĪÇÏ´Â ¹®ÀÚ¿­·Î Æò°¡µÇ´Â ½ÄÀÌ´Ù.

File-specification ÀÇ Á¤È®ÇÑ ÇüÅ´ ´ç½ÅÀÌ »ç¿ëÇÏ´Â Common Lisp ÇÁ·Î±×·¥°ú ¿î¿µÃ¼Á¦¿¡ µû¶ó ´Ù¸¦ ¼ö ÀÖ´Ù. ±×·¯³ª, ÀϹÝÀûÀ¸·Î program.lisp ¶ó´Â ÆÄÀÏÀÌ Á¸ÀçÇÏ´Â µð·ºÅ丮¿¡¼­ Common Lisp ¸¦ ½ÇÇà½ÃŲ´Ù¸é, (load "program.lisp") À» Æò°¡ÇÏ´Â °ÍÀ¸·Î ±× ÆÄÀÏÀ» ·ÎµåÇÏ°í ±× ¾È¿¡ ÀÖ´Â ½ÄµéÀ» Æò°¡ÇÏ°Ô µÈ´Ù. ¶ÇÇÑ load ¹®À» ÆÄÀÏ ¾È¿¡ ³¢¿ö³ÖÀ½À¸·Î½á ÆÄÀϵ鰣ÀÇ ÀÇÁ¸°ü°è (dependency) ¸¦ ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, program.lisp °¡ functions.lisp ¾È¿¡ ÀÖ´Â Á¤ÀÇ¿¡ ÀÇÁ¸ÇÑ´Ù¸é (load "function.lisp") ¹®À» program.lisp ÀÇ ¾îµò°¡¿¡ ³õ¾Æ¾ß ÇÑ´Ù.

5. ȯ°æ°ú ±âÈ£¿Í À¯È¿¹üÀ§

¾Õ¼± Åä·Ð¿¡¼­ °ªÁöÁ¤ (assignment) ÀÇ Ç¥±â¿¡ ´ëÇÑ »çÇ×Àº ¼Ò°³ÇÏÁö ¾Ê¾Ò´Ù. »ç½Ç, ½ÉÁö¾î º¯¼ö (variable) ¶õ ´Ü¾îÁ¶Â÷µµ ¾ð±ÞÇÏÁö ¾Ê¾Ò´Ù. ÇÔ¼ö Á¤ÀÇ¿¡¼­ Çü½Ä ¸Å°³º¯¼öÀÇ Ä¡È¯¿¡ ´ëÇؼ­´Â À̾߱âÇßÁö¸¸, Çü½Ä ¸Å°³º¯¼ö¿¡ °ªÀ» "ÁöÁ¤" ÇÒ ¼ö´Â ¾ø¾úÀ» °ÍÀÌ´Ù. defun À¸·Î ÇÔ¼ö Á¤ÀǸ¦ ±âÈ£·Î ÁöÁ¤ÇÒ ¼ö ÀÖ´Â °ÍÀº »ç½ÇÀÌ´Ù. ÇÏÁö¸¸, ´ÙÀ½ Àý¿¡¼­ ¾ð±ÞÇÒ À̸§¾ø´Â ÇÔ¼ö¸¦ »ç¿ëÇÔÀ¸·Î½á defun À» ÇÇÇÒ ¼öµµ ÀÖ´Ù. ÇÔ¼ö À̸§ÀÌ ¾Æ´Ñ ±âÈ£µéÀº t ³ª nil °°Àº »ó¼ö¿´´Ù. ÀÌÁ¦±îÁö ¼Ò°³ÇÑ Lisp ÀÇ ºÎºÐÁýÇÕÀº ±âº»ÀûÀ¸·Î ¼ø¼ö Lisp ÀÌ´Ù. Áï ÇÔ¼ö, »ó¼ö, ºÎ¿ï ¿¬»êÀÚ¸¸À» °®°í, °ªÁöÁ¤ÀÌ ¾ø´Â Lisp ÀÌ´Ù. °è¼ÓÇؼ­ °ªÁöÁ¤°ú º¯¼ö¸¦ Lisp ¿¡ Ãß°¡ÇÒ °ÍÀÌ°í ±×·¸°Ô ÇÔÀ¸·Î½á Lisp °¡ ¸Þ¸ð¸®¸¦ »ç¿ëÇÏ´Â ¸î °¡Áö ¹æ¹ý¿¡ ´ëÇØ È®½ÇÇÏ°Ô ¼³¸íÇÒ °ÍÀÌ´Ù.

±âÈ£¿¡ °ª ÁöÁ¤Çϱâ

»ç½Ç Lisp ¿¡¼­ º¯¼ö¿Í ±âÈ£°£¿¡ Â÷ÀÌÁ¡Àº ¾ø°í ±× ¿ë¾î¸¦ ¹Ù²Ù¾î ¾²±âµµ ÇÑ´Ù. ±âÈ£´Â ¹Ù²Ü ¼ö ÀÖ´Â °ª (value) À» °¡Áö°í ÀÖ´Ù. Lisp ¿¡¼­ÀÇ ±âÈ£´Â °ª¿¡ ÀÇÇÑ È£Ãâ (call-by-value) º¯¼ö¸¦ »ç¿ëÇÏ´Â ¾ð¾î¿¡¼­ÀÇ º¯¼ö¿¡ ÇØ´çÇÑ´Ù. ¿ì¸®´Â setq (set equal ¿¡¼­ ±âÀÎÇÔ) ¶ó´Â Ư¼ö Çü½ÄÀ» »ç¿ëÇÏ¿© ±âÈ£ÀÇ °ªÀ» ÁöÁ¤Çϰųª ¹Ù²Ü ¼ö ÀÖ´Ù.

setq ´Â ÃÖ¼ÒÇÑ µÎ °³ÀÇ Àμö¸¦ °®´Âµ¥, ù¹ø° °ÍÀº ¹Ýµå½Ã ±âÈ£À̸鼭 Æò°¡µÇ¾î¼­´Â ¾ÈµÇ°í, µÎ¹ø° °ÍÀº ¾î¶² ½ÄÀÌ¶óµµ µÉ ¼ö ÀÖ°í Æò°¡µÈ´Ù.

Setq ´Â (setq new 1 old 0) °ú °°ÀÌ ¿©·¯ °³ÀÇ ±âÈ£ÀÇ °ªÀ» Çѹø¿¡ ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù.

Eval ÀÌ ±âÈ£¸¦ ¸¸³ª¸é Å×ÀÌºí °°Àº ±¸Á¶¿¡¼­ ±× ±âÈ£ÀÇ °ªÀ» ã´Â´Ù. ¸¸ÀÏ ±× Å×ÀÌºí¿¡ ±× ±âÈ£¿¡ ´ëÇÑ ¾Æ¹«·± µî·Ï »çÇ×ÀÌ ¾øÀ¸¸é ¿À·ù¸¦ º¸°íÇÑ´Ù. ±× ±¸Á¶´Â ȯ°æ (environment) À̶ó°í Çϴµ¥, eval Àº ã¾Æ¾ß ÇÒ Àû´çÇÑ È¯°æÀ» ¾Ë¾Æ³»¾ß ÇÑ´Ù. ¾ÕÀÇ ¿¹¿¡¼­ eval Àº Àü¿ª ȯ°æ (global environment) ¿¡¼­ ±âÈ£°ªÀ» ã´Â´Ù. ³ªÁß¿¡ ¾î¶»°Ô ºÎ°¡ÀûÀΠȯ°æÀÌ »ý¼ºµÇ°í, eval ¿¡ ÀÇÇؼ­ ÂüÁ¶µÇ´ÂÁö¸¦ ¼³¸íÇÒ °ÍÀÌ´Ù.

Common Lisp ¿¡¼­ ±âÈ£´Â ±×°ÍÀÌ ÇÔ¼öÀÇ Àμö·Î ³ªÅ¸³¯ ¶§ »ç¿ëµÇ´Â °ª°ú, ±×°ÍÀÌ ÇÔ¼ö È£Ãâ·Î Çؼ®µÇ´Â ¸®½ºÆ®ÀÇ Ã¹¹ø° ¿ø¼Ò·Î ³ªÅ¸³¯ ¶§ »ç¿ëµÇ´Â ÇÔ¼öÁ¤ÀǸ¦ °¡Áú ¼ö ÀÖ´Ù.

Eval °ú Apply ÀÇ Àç¹æ¹®

ÀÌ ½ÃÁ¡¿¡¼­ ±âÈ£¿Í ȯ°æÀ» °í·ÁÇÏ´Â eval °ú apply ÀÇ µ¿ÀÛ¿¡ ´ëÇؼ­ ´Ù½Ã »ý°¢Çغ¸ÀÚ. Eval Àº ½Ä¿¡ ÇØ´çÇÏ´Â ÇϳªÀÇ Àμö¸¦ °®´Â´Ù. ¶ÇÇÑ, eval ¿¡°Ô´Â ¿ì¼± ÇϳªÀÇ È¯°æÀ¸·Î Àü¿ª ȯ°æÀÌ ÁÖ¾îÁø´Ù. ´ÙÀ½¿¡ eval ÀÇ µ¿ÀÛÀ» ¼³¸íÇÏ´Â ÀÇ»çÄÚµå (pseudo code) °¡ ÀÖ´Ù.

¾Õ Àý¿¡¼­ ġȯ¸ðµ¨À» »ç¿ëÇÏ¿© apply ¸¦ ¼³¸íÇÏ¿´´Ù. ÀÌÁ¦ ȯ°æÀÇ °üÁ¡¿¡¼­ ¶Ç ´Ù¸¥ ¸ðµ¨À» ¼³¸íÇÑ´Ù. Apply ´Â ÇϳªÀÇ ÇÔ¼ö¿Í ±×°ÍÀÇ Àμö¿¡ ÇØ´çÇÏ´Â ½ÄµéÀÇ ¸®½ºÆ®¸¦ Àμö·Î ÃëÇÑ´Ù. °¢ ÇÔ¼ö´Â ±×°ÍÀÌ Á¤ÀÇµÈ È¯°æ°ú ¿¬°üµÇ¾î ÀÖ´Ù. ¸¹Àº °æ¿ì¿¡ À־ ¿¬°üµÈ ȯ°æÀº ¿ÀÁ÷ Àü¿ª ȯ°æÀÌÁö¸¸, ¿¹¿ÜÀûÀÎ °æ¿ìµµ ÀÖ´Ù. Apply ´Â ÁÖ¾îÁø ÇÔ¼ö¿Í ¿¬°üµÈ ȯ°æÀ» »ç¿ëÇÏ¿© »õ·Î¿î ȯ°æÀ» ¸¸µå´Âµ¥, °Å±â¼­ ±× ÇÔ¼öÀÇ Á¤ÀǸ¦ Æò°¡ÇÏ°Ô µÈ´Ù. ´ÙÀ½ Àý¿¡¼­ ÇÑ È¯°æÀ¸·ÎºÎÅÍ ¾î¶»°Ô ´Ù¸¥ ȯ°æµéÀÌ »ý¼ºµÇ´Â°¡¸¦ ¸íÈ®ÇÏ°Ô ¼³¸íÇÒ °ÍÀÌ´Ù. eval °ú ¸¶Âù°¡Áö·Î apply µµ ȯ°æÀÌ ÁÖ¾îÁø´Ù.

eval °ú apply ¸ðµÎ Lisp ÇÁ·Î±×·¥¿¡¼­ È£ÃâµÉ ¼ö ÀÖ´Â ÇÔ¼ö¶ó´Â °Í¿¡ À¯³äÇØ¾ß ÇÑ´Ù. apply ´Â ³ªÁß¿¡ ¼³¸íÇÒ °ÍÀÌ´Ù. Lisp Äڵ忡¼­ eval À» »ç¿ëÇÏ´Â °ÍÀº ´ëºÎºÐÀÇ Lisp ÇÔ¼ö¿Í ¸¶Âù°¡Áö·Î eval ÀÌ ±×°ÍÀÇ Àμö¸¦ Æò°¡ÇÑ´Ù´Â »ç½Ç ¶§¹®¿¡ º¹ÀâÇØÁø´Ù. ÀÌ°ÍÀÌ ¼øȯÀûÀ¸·Î º¸ÀÎ´Ù¸é ±×°ÍÀº ½ÇÁ¦·Î ±×·¸±â ¶§¹®ÀÌ´Ù. ¾Õ¿¡¼­´Â ù¹ø° ´Ü°èÀÇ Æò°¡°¡ ¾î¶² ½ÄÀ¸·Î ³ª¿Â °Íó·³ ±× ù¹ø° ´Ü°èÀÇ Æò°¡¸¦ ¹«½ÃÇÏ°í eval ÀÌ ¹«¾ùÀ» Çϴ°¡ ¸¸À» °í·ÁÇß´Ù. °ÅÀÇ »ç¿ëÇÒ ÇÊ¿ä´Â ¾øÁö¸¸ ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ ¶§¿¡ Ȥ½Ã eval À» »ç¿ëÇÏ°íÀÚ Çϸé ÁÖÀÇÇϱ⠹ٶõ´Ù.

±¸Á¶È­µÈ ȯ°æ

ÇϳªÀÇ È¯°æÀº ±âÈ£ÀÇ °ªÀ» À§ÇÑ ÀúÀå¼Ò (storage) ¸¦ ÇÒ´çÇÑ´Ù. Àü¿ª Å×À̺íÀº ´ÜÁö ÇϳªÀÇ Ä¿´Ù¶õ Å×À̺í·Î »ý°¢ÇÒ ¼ö ÀÖ´Ù. »õ·Î¿î ±âÈ£¸¦ setq ÇÒ ¶§¸¶´Ù ±× ±âÈ£ÀÇ °ªÀ» °¡¸®Å°´Â Àü¿ª ȯ°æ¿¡¼­ ¸Þ¸ð¸®°¡ ÀâÈù´Ù. ÇÔ¼ö¸¦ Àû¿ëÇÏ´Â µ¿¾È°ú ¾î¶² Ư¼ö Çü½ÄÀ» Æò°¡ÇÒ ¶§¿¡ »ý¼ºµÈ ȯ°æÀº º¸´Ù º¹ÀâÇÑ ±¸Á¶¸¦ °®´Â´Ù. ÀϹÝÀûÀ¸·Î ÇϳªÀÇ È¯°æÀº Å×À̺íÀÇ ¿¬°á ¸®½ºÆ® (linked list) ÀÌ´Ù. »õ·Î¿î ȯ°æÀº ±âÁ¸ÀÇ È¯°æÀ¸·ÎºÎÅÍ »ý¼ºµÇ´Âµ¥, À̶§ »õ·Î¿î Å×À̺íÀ» »ý¼ºÇÏ°í ±×°ÍÀÌ ±âÁ¸ÀÇ ºÎ¸ð ȯ°æÀ» °¡¸®Å°µµ·Ï ÇÑ´Ù. ÇÔ¼ö Á¤ÀÇÀÇ °æ¿ì¿¡ Çü½Ä ¸Å°³º¯¼ö¸¦ À§ÇÏ¿© Å×ÀÌºí¿¡ °ø°£ÀÌ ¸¶·ÃµÈ´Ù. ȯ°æ ¾È¿¡¼­ ±âÈ£ÀÇ °ªÀ» °áÁ¤Çϱâ À§ÇÏ¿© eval Àº ¿ì¼± ȯ°æÀÌ °¡¸®Å°´Â Å×À̺íÀ» Á¶»çÇØ º»´Ù. ±× Å×ÀÌºí¿¡ ±âÈ£¿¡ ´ëÇÑ µî·ÏÀÌ ¾øÀ¸¸é, eval Àº ºÎ¸ð ȯ°æÀ» µé¿©´Ùº¸°í °è¼ÓÇؼ­ Àü¿ª ȯ°æ¿¡ µµ´ÞÇÒ ¶§±îÁö °è¼ÓÇÏ°Ô µÈ´Ù. ´ç½ÅÀº Àü¿ª ȯ°æÀÇ °ªÀ» ¹Ù²ÙÁö ¾Ê°í ÇÑ È¯°æ¿¡ ÀÖ´Â ±âÈ£ÀÇ Áö¿ª°ª (local value) À» ¹Ù²Ü ¼ö ÀÖ´Ù.

 

±×¸² 5  ÇÔ¼ö È£Ãâ µ¿¾È¿¡ »ý¼ºµÈ ȯ°æµé

±×¸² 5 ´Â (local (+ x 1)) ÀÇ ¼öÇà µ¿¾È¿¡ °¢ ´Ü°è¿¡¼­ ³ªÅ¸³ª´Â ȯ°æÀ» º¸¿©ÁÖ°í ÀÖ´Ù. ÀϹÝÀûÀ¸·Î ÀÌ·¸°Ô ÇÏ´Â Áß¿äÇÑ ÀÌÀ¯ ÁßÀÇ Çϳª´Â, Àü¿ª º¯¼öµéÀº ±ä Äڵ忡¼­ ÃßÀûÇϱⰡ ¾î·Æ´Ù´Â °ÍÀÌ´Ù. ³Î¸® Èð¾îÁ® ÀÖ´Â Àü¿ª º¯¼öµéÀº Å« ÇÁ·Î±×·¥À» ÀÌÇØÇϱ⠾î·Æ°Ô ¸¸µç´Ù.

Áö¿ªº¯¼ö

Áö¿ª º¯¼ö (local variables) ·Î »ç¿ëÇϱâ À§Çؼ­ Çü½Ä ¸Å°³º¯¼ö·Î ±âÈ£¸¦ µµÀÔÇÒ ÇÊ¿ä´Â ¾ø´Ù. Ư¼ö Çü½ÄÀÎ let Àº »õ·Î¿î ȯ°æÀ» ¸¸µé¾î ³»±â À§ÇØ »ç¿ëµÈ´Ù. let À» »ç¿ëÇÏ¿© Áö¿ª º¯¼ö¸¦ ¸¸µé¾î³»°í ³ªÁß¿¡ ƯÁ¤ °ªÀ¸·Î setq Çϰųª ¶Ç´Â ±×°ÍÀ» µµÀÔÇÒ ¶§¿¡ ¹Ù·Î °ªÀ» ÇÒ´çÇÒ ¼ö ÀÖ´Ù. ÀϹÝÀûÀÎ Çü½ÄÀº (let variable-specifications body) Àε¥, ¿©±â¼­ variable-specifications ´Â 0 °³ ÀÌ»óÀÇ ½ÄÀ¸·Î ÀÌ·ç¾îÁø ¸®½ºÆ®ÀÌ°í, °¢°¢ÀÇ ½ÄÀº ÇϳªÀÇ º¯¼ö ¶Ç´Â (variable initial-value-expression) ÇüÅÂÀÇ ½Ä¿¡ ÇØ´çÇÑ´Ù. body ´Â Çϳª ÀÌ»óÀÇ ½ÄÀ¸·Î ±¸¼ºµÇ¾î ÀÖ´Ù. ±×·¯ÇÑ Çü½ÄÀ» Æò°¡ÇÒ ¶§ Lisp ´Â °¢ º¯¼ö¿¡ ÇØ´çÇÏ´Â ÃʱⰪ ½Ä (initial value expression) ÀÌ ÀÖÀ» °æ¿ì¿¡´Â ±× °ªÀ» ÇÒ´çÇÏ°í, ¾øÀ» °æ¿ì¿¡´Â nil À» ÇÒ´çÇÑ´Ù. ÀÌ·¯ÇÑ ÁöÁ¤Àº º´·ÄÀûÀ¸·Î ÀÌ·ç¾îÁ®¼­ ´Ù¸¥ ÃʱⰪ ½Ä¿¡ ÀÖ´Â º¯¼ö¸¦ ÂüÁ¶ÇÒ ¼ö ¾ø´Ù. let* ¶ó°í ºÒ¸®¿ì´Â let ÀÇ º¯ÇüÀÌ Àִµ¥, ±×°ÍÀº Áö¿ª º¯¼ö¸¦ ¼øÂ÷ÀûÀ¸·Î °ªÀ» ÁöÁ¤Çؼ­ variable-specifications ¸®½ºÆ®¿¡¼­ ³ªÁß¿¡ ³ªÅ¸³ª´Â ´Ù¸¥ º¯¼öÀÇ ÃʱⰪ ½Ä¿¡ ¾Õ¼± º¯¼ö¸¦ ÂüÁ¶ÇÒ ¼ö ÀÖ´Ù.

´ÙÀ½Àº ÇϳªÀÇ ¼±»ó¿¡ ÀÖ´Â x, y ÁÂÇ¥·Î Ç¥ÇöµÇ´Â µÎ Á¡À» ÃëÇÏ°í, ¼¼¹ø° Á¡ÀÇ x ÁÂÇ¥°¡ ÁÖ¾îÁ³À» ¶§¿¡, ±× Á¡ÀÇ y ÁÂÇ¥¸¦ ¸®ÅÏÇÏ´Â °£´ÜÇÑ ¼±Çüº¸°£ (linear interpolation) ÇÔ¼öÀÇ Á¤ÀǸ¦ ÀÌ¿ëÇؼ­ Áö¿ª º¯¼ö¸¦ ÁöÁ¤ÇÏ´Â µÎ °¡Áö ¹æ¹ýÀ» ¼³¸íÇÑ´Ù.

0 À¸·Î ³ª´©´Â °ÍÀ» ÇÇÇϱâ À§Çؼ­ if ¹®À» »ç¿ëÇÏ¿´´Ù.

´ÙÀ½ ÇÔ¼ö´Â let À» »ç¿ëÇÏ´Â ´Ù¸¥ ¿¹¸¦ º¸¿©Áִµ¥ ÀÌ °æ¿ì´Â cond ¹®À» »ç¿ëÇÑ´Ù. Read ´Â Àμö°¡ ¾øÀÌ Ç¥ÁØ ÀÔ·Â (ÁÖ·Î Å͹̳Î) À¸·ÎºÎÅÍ ÇϳªÀÇ ½ÄÀ» Àд ÇÔ¼öÀÌ°í, random Àº ¾ç¼ö n ¿¡ ÇØ´çÇÏ´Â ÇϳªÀÇ Àμö¸¦ ÃëÇÏ°í, 0 ¿¡¼­ n »çÀÌ (À̶§ 0 Àº Æ÷ÇԵdzª n Àº Æ÷ÇÔµÇÁö ¾ÊÀ½) ÀÇ °°Àº ÇüÀÇ ¼ö (ÀÌ °æ¿ì¿¡´Â Á¤¼ö) ¸¦ ¸®ÅÏÇÏ´Â ÇÔ¼öÀÌ´Ù. n ÀÌ Á¤¼öÀÎ °æ¿ì¿¡ °¡´ÉÇÑ °á°úµéÀº ´ë·«ÀûÀ¸·Î 1/n ÀÇ ºóµµ·Î ³ªÅ¸³­´Ù.

3 Àº ÇÁ·ÒÇÁÆ® (prompt) ¿¡ ´ëÀÀÇؼ­ »ç¿ëÀÚ°¡ ÀÔ·ÂÇÑ °ÍÀÌ´Ù.

 

±×¸² 6  ÁßøµÈ let ¹®À» »ç¿ëÇÏ¿© »ý¼ºµÈ ȯ°æµé

»çÀüÀû À¯È¿¹üÀ§ °áÁ¤

¿ì¸®´Â let ¹®À» ¿©·¯ °³ ÁßøÇÔÀ¸·Î½á º¸´Ù º¹ÀâÇÑ ±¸Á¶ÀÇ È¯°æÀ» ¸¸µé ¼ö ÀÖ´Ù. ÇϳªÀÇ È¯°æÀ» ÅëÇؼ­ µµÀÔµÈ º¯¼öÀÇ À¯È¿¹üÀ§ (scope) ´Â let ¶Ç´Â defun ¿¡¼­ Á¤ÀÇµÈ °ýÈ£ÀÇ ¹üÀ§¿¡ ÀÇÇؼ­ °áÁ¤µÈ´Ù. ÀÌ·¯ÇÑ ÀÌÀ¯·Î ±×·± º¯¼öµéÀ» °¡²û »çÀüÀû ¶Ç´Â Á¤Àû (static) º¯¼ö·Î ºÎ¸£°í, ±×°ÍµéÀÇ À¯È¿¹üÀ§¸¦ °áÁ¤ÇÏ´Â ±ÔÄ¢À» »çÀüÀû À¯È¿¹üÀ§ (lexical scoping) ¶ó°í ºÎ¸¥´Ù. ¸¹Àº Lisp º¯ÇüµéÀº À¯È¿¹üÀ§°¡ Æò°¡ ½Ã°£¿¡ °áÁ¤µÇ´Â µ¿Àû (dynamic) º¯¼ö¸¦ Áö¿øÇÑ´Ù. »çÀüÀûÀ¸·Î À¯È¿¹üÀ§°¡ °áÁ¤µÈ º¯¼ö¿¡ ÀüÀûÀ¸·Î ÀÇÁ¸ÇÏ´Â ÄÚµå´Â ÇÁ·Î±×·¡¸Ó°¡ º¸´Ù ÀÌÇØÇϱ⠽±°í ÄÄÆÄÀÏ·¯°¡ È¿À²ÀûÀÎ Äڵ带 »ý¼ºÇÑ´Ù´Â ÀåÁ¡À» °¡Áö°í ÀÖ´Ù. º¯¼ö´Â Àü¿ªÀû (global) À̰ųª Áö¿ªÀû (local) ÀÌ°í, Áö¿ªÀûÀÎ °æ¿ì¿¡´Â »çÀüÀû À¯È¿¹üÀ§ °áÁ¤ ¹æ¹ýÀ» ÃëÇÑ´Ù.

´ÙÀ½ÀÇ Äڵ忡¼­ Lisp ÀÇ ÇÁ¸°Æ® ÇÔ¼öÀÎ princ ¸¦ »ç¿ëÇÏ¿© º¯¼öÀÇ »çÀüÀû À¯È¿¹üÀ§ °áÁ¤À» ¼³¸íÇÑ´Ù. princ ´Â ±×°ÍÀÇ Àμö¸¦ Æò°¡ÇÏ°í, ±× °á°ú¸¦ ÇÁ¸°Æ®ÇÏ°í, ÇÁ¸°Æ® ¹®ÀÇ °ªÀ¸·Î ±× °á°ú¸¦ ¸®ÅÏÇÏ´Â ÇÔ¼öÀÌ´Ù.

let ¹® ´ÙÀ½¿¡ ¿À´Â ù¹ø° ÁÙÀº ¼¼ °³ÀÇ princ ¸¦ È£ÃâÇÑ °á°úÀÌ´Ù. µÎ¹ø° ÁÙÀº let ¹®¿¡ ÀÇÇØ ¸®ÅÏµÈ °ªÀÌ´Ù. ±×¸² 6 Àº ÄÚµåÀÇ ½ÇÇà µ¿¾È¿¡ ´Ù¸¥ ´Ü°è¿¡¼­ Á¸ÀçÇϴ ȯ°æÀ» º¸¿©ÁÖ°í ÀÖ´Ù.

Let ¹®Àº º¹ÀâÇÑ ±¸Á¶ÀÇ È¯°æÀ» ±¸ÃàÇÒ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù. ÀÌÁ¦±îÁö ¼³¸íÇÑ °ÍÀ¸·ÎºÎÅÍ ÇϳªÀÇ ÇÔ¼ö°¡ È£ÃâµÉ ¶§ Æò°¡´Â »õ·Î¿î ȯ°æ¿¡¼­ ½ÃÀÛÇϸç Çü½Ä ¸Å°³º¯¼ö¸¦ ÀúÀåÇÏ°í Àü¿ª ȯ°æÀ» °¡¸®Å°´Â »õ·Î¿î Å×À̺íÀ» Æ÷ÇÔÇÑ´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. let ÀÌ ¾øÀ¸¸é ¸ðµç ȯ°æÀº Àü¿ª ȯ°æÀ» °¡¸®Å°´Â ÇϳªÀÇ Å×ÀÌºí¸¸À¸·Î ±¸¼ºµÉ °ÍÀÌ´Ù. ±×¸² 7 Àº Àç±ÍÇÔ¼ö¸¦ Æ÷ÇÔÇÏ´Â ÇϳªÀÇ ¿¹·Î¼­, (raise 3 2) ÀÇ ½ÇÇà µ¿¾È¿¡ ´Ù¸¥ ´Ü°è¿¡ Á¸ÀçÇϴ ȯ°æµéÀ» º¸¿©ÁÖ°í ÀÖ´Ù. ´ÙÀ½ Àý¿¡¼­´Â ȯ°æÀ» ÀÌ¿ëÇÏ´Â º¸´Ù º¹ÀâÇÑ ¹æ¹ý¿¡ ´ëÇؼ­ »ý°¢ÇØ º»´Ù.

6. ÇÔ¼ö¿¡ °üÇÑ Ãß°¡»çÇ×

ÀÌÁ¦±îÁö ¼Ò°³ÇÑ ÇÔ¼ö¸¦ Á¤ÀÇÇÏ°í »ç¿ëÇÏ´Â ¹æ¹ýµéÀº ¾à°£ÀÇ Á¦ÇÑÀ» °¡Áö°í ÀÖ´Ù. ¿¹¸¦ µé¾î, ÇÔ¼ö´Â Àü¿ª º¯¼ö¸¦ Á¦¿ÜÇÏ°í´Â ÀÌÀü¿¡ È£ÃâµÈ °ªÀ» ´Ù½Ã ºÒ·¯³¾ ¼ö ¾ø´Ù. ¸ðµç ÇÔ¼ö´Â À̸§À» °¡Á®¾ß ÇÑ´Ù. ÇÔ¼ö´Â »õ·Î¿î ÇÔ¼ö¸¦ »ý¼ºÇϰųª, Àμö·Î ÇÔ¼ö¸¦ Àü´ÞÇϰųª, defun À¸·Î Á¤ÀǵÇÁö ¾ÊÀº ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ¾ø´Ù. ÀÌ Àý¿¡¼­´Â ÀÌ·¯ÇÑ Á¦ÇÑÀ» ¾î¶»°Ô ±Øº¹ÇÒ ¼ö ÀÖ´ÂÁö¸¦ ¼³¸íÇÑ´Ù.

Áö¿ª»óŸ¦ °¡Áø ÇÔ¼ö

ÀÚ·á ¶Ç´Â »óÅ (state) ¸¦ ÇϳªÀÇ Æ¯Á¤ ÇÔ¼ö ¶Ç´Â ¿©·¯ ÇÔ¼ö·Î ¿¬°ü½ÃÅ°´Â °ÍÀÌ Á¾Á¾ À¯¿ëÇÒ ¶§°¡ ÀÖ´Ù. ÀÌ·¸°Ô Çϱâ À§ÇÑ ¹æ¹ýÀº ´Ù¼öÀÇ Àü¿ª º¯¼ö¸¦ »ý¼ºÇÏ°í Àû´çÇÑ °ªÀ¸·Î setq ÇÏ´Â °ÍÀÌ´Ù. ±×·¯³ª ¾Õ¿¡¼­ ÁöÀûÇßµíÀÌ ÀÌ·¸°Ô Àü¿ª º¯¼ö¸¦ ÀÌ¿ëÇϸé ÇÁ·Î±×·¥À» ÀÌÇØÇϱâ Èûµé¾îÁø´Ù. ´Ù¸¥ ¹æ¹ýÀº Áö¿ª»óÅ (local state) ¸¦ ÂüÁ¶Çϴ ȯ°æ¿¡ Áö¿ª º¯¼ö¸¦ »ç¿ëÇÏ´Â ÇÔ¼öµéÀ» ÁßøÇÏ´Â ÇüÅ·Πȯ°æÀ» »ý¼ºÇÏ´Â °ÍÀÌ´Ù.

ÇϳªÀÇ È¯°æÀÌ Á¸ÀçÇØ ÀÖ´Â µ¿¾ÈÀ» ±×°ÍÀÇ À¯È¿±â°£ (extent) À̶ó°í ºÎ¸¥´Ù. ÀÌÁ¦±îÁö ¿ì¸®°¡ ¾ð±ÞÇØ¿Ô´ø ȯ°æÀÇ À¯È¿±â°£Àº ´ÜÁö ÇϳªÀÇ ÇÁ·Î½ÃÀú¸¦ ½ÇÇàÇϴµ¥ °É¸®´Â ½Ã°£ÀÌ´Ù. ÇÑ °¡Áö ÁÖ¸ñÇØ¾ß ÇÒ ¿¹¿Ü°¡ ÀÖ´Ù. Àü¿ª ȯ°æÀÇ À¯È¿±â°£Àº Lisp ÇÁ·Î¼¼½º°¡ ½ÇÇàµÇ°í ÀÖ´Â Àüü ½Ã°£ÀÌ´Ù. ±âÈ£¿Í ¿¬°üµÈ Lisp °´Ã¼°¡ »ý¼ºµÉ ¶§¸¶´Ù ±× °´Ã¼´Â ±×°ÍÀÇ È¯°æÀ» °¡¸®Å°´Â Æ÷ÀÎÅ͸¦ À¯ÁöÇÏ¿© ±× ȯ°æÀÌ ÂüÁ¶ÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù. ±× °´Ã¼°¡ Á¸ÀçÇÏ´Â ÇÑ ±×°Í°ú ¿¬°üµÈ ȯ°æÀº °è¼Ó Á¸ÀçÇÏ°Ô µÈ´Ù. ÀÌÁ¦±îÁö ¿ì¸®°¡ »ìÆ캻 Lisp °´Ã¼ Áß¿¡¼­ º¯¼ö¸¦ ÂüÁ¶ÇÒ ¼ö ÀÖ´Â °´Ã¼´Â ´ÜÁö ÇÔ¼öµé»ÓÀ̾úÀ¸³ª °ð ±×·¯ÇÑ ´Ù¸¥ °´Ã¼¸¦ ¾î¶»°Ô »ý¼ºÇÏ´ÂÁö¸¦ ¹è¿ï °ÍÀÌ´Ù.

ÀÌÁ¦±îÁö °í·ÁÇØ ¿Ô´ø ¸ðµç ÇÔ¼öµéÀº ±×°Í°ú °ü·ÃµÈ ȯ°æÀ¸·Î Àü¿ª ȯ°æÀ» °¡Áö°í ÀÖÀ¸³ª ´Ù¸¥ ȯ°æÀ¸·Îµµ ½±°Ô ÇÔ¼ö¸¦ Á¤ÀÇÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½ÀÇ squrelast ¶ó´Â ÇÔ¼ö´Â ¸¶Áö¸·À¸·Î »ç¿ëÇÑ Àμö¿¡ ÇØ´çÇÏ´Â ¼ýÀÚ¸¦ ±â¾ïÇϱâ À§ÇØ Áö¿ª»óŸ¦ »ç¿ëÇÏ°í ±× ¼ýÀÚÀÇ Á¦°ö°ªÀ» ¸®ÅÏÇÑ´Ù. Squarelast ´Â »ç¿ëÀÚ°¡ »ç¿ëÇϱ⠹ٷΠÀÌÀü ´Ü°èÀÇ ´äÀ» ³½´Ù.

 

±×¸² 7  Àç±ÍÇÔ¼öÀÇ È£Ãâ µ¿¾È¿¡ »ý¼ºµÈ ȯ°æµé

¶÷´Ù¿Í Àμö·Î¼­ÀÇ ÇÔ¼ö

defun À¸·Î Á¤ÀǵǾî À̸§ÀÌ ºÙ¿©Áø ÇÔ¼ö´Â º¯¼ö¿¡ ÀÇÇØ ÂüÁ¶µÉ ¼ö ¾ø´Â Lisp ÀÇ À¯ÀÏÇÑ °´Ã¼ÀÌ´Ù. Lisp ´Â ¶÷´Ù (lambda) ÇÔ¼ö¶ó°í ºÒ¸®¿ì´Â À̸§ÀÌ ¾ø´Â ÇÔ¼ö¸¦ »ý¼ºÇÒ ¼ö ÀÖ´Ù. (function (lambda arguments body)) ÀÇ ½ÄÀº arguments ¿¡ ÀÖ´Â Çü½Ä ¸Å°³º¯¼ö¿Í body ¿¡ ÀÖ´Â ½ÄÀ¸·Î Á¤ÀÇµÈ ÇÔ¼ö·Î Æò°¡ÇÑ´Ù. Function Àº ±×°ÍÀÇ Àμö¸¦ Æò°¡ÇÏÁö ¾Ê´Â´Ù. ù¹ø° ¿ø¼Ò°¡ lambda ÀÎ ¸®½ºÆ®³ª (function square) ¿¡¼­ÀÇ square ¿Í °°ÀÌ ÇϳªÀÇ ÇÔ¼ö·Î Á¤ÀÇµÈ ±âÈ£°¡ Àμö·Î »ç¿ëµÈ´Ù. ÇÔ¼ö´Â Æí¸®ÇÑ ´ÜÃàÇüÀ» °¡Áö°í ÀÖ´Ù. Common Lisp ¿¡¼­´Â (function expression) ÀÇ ´ÜÃàÇüÀ¸·Î #'expression À̶ó°í ¾µ ¼ö ÀÖ´Ù. Common Lisp ¿¡¼­´Â ±×·¯ÇÑ ÇÔ¼ö¸¦ ´Ü¼øÈ÷ ¸®½ºÆ®ÀÇ Ã¹¹ø° ¿ø¼Ò·Î ÇÏ¿© È£ÃâÇÒ ¼ö ¾ø°í (Scheme À̶ó´Â Lisp ¹öÀü¿¡¼­´Â ÇÒ ¼ö ÀÖ´Ù), funcall ¶Ç´Â apply ¸¦ ½á¾ß ÇÑ´Ù.

Funcall Àº Àμö·Î ÇÔ¼ö·Î Æò°¡µÇ´Â ½Ä°ú ±× ÇÔ¼ö°¡ °®°Ô µÇ´Â ÀμöµéÀ» ÃëÇÑ´Ù. Áï, (funcall #'square 3) ÀÇ ÇüÅÂÀÌ´Ù. Apply ´Â µÎ °³ÀÇ Àμö¸¸À» °®´Â´Ù´Â Á¡ ÀÌ¿Ü¿¡´Â funcall °ú ºñ½ÁÇѵ¥ µÎ¹ø°ÀÇ Àμö´Â ù¹ø°ÀÇ Àμö¿¡ ÇØ´çÇÏ´Â ÇÔ¼ö¿¡ Á¦°øµÇ´Â ÀμöÀÇ ¸®½ºÆ®·Î Æò°¡µÇ¾î¾ß ÇÑ´Ù. ¾ÆÁ÷ ¸®½ºÆ®·Î Æò°¡µÇ´Â ½ÄÀ» ¸¸µå´Â ¹æ¹ýÀ» ¼³¸íÇÏÁö ¾Ê¾Ò±â ¶§¹®¿¡ apply ¸¦ »ç¿ëÇÑ ¿¹´Â Àá½Ã ¹Ì·çµµ·Ï ÇÑ´Ù. ´ÙÀ½¿¡ ÇÔ¼ö¿Í funcall À» ¼³¸íÇÏ´Â °£´ÜÇÑ ¿¹°¡ ÀÖ´Ù.

À̸§À» °¡Áø ÇÔ¼ö¿Í lambda ÇÔ¼ö´Â ¸ðµÎ Á¾Á¾ º¯¼ö·Î Àü´ÞµÇ°Å³ª funcall ÀÇ Àμö·Î Àü´ÞµÇ±â À§ÇØ ¸®½ºÆ® ¾È¿¡ ÀÖ°Ô µÈ´Ù.

Lambda ÇÔ¼öµµ ¿¬°üµÇ¾î ÀÖ´Â »óÅ (associated state) ¸¦ °¡Áú ¼ö ÀÖ´Ù.

¸¸ÀÏ counter ¶ó´Â ±âÈ£¿¡ »õ·Î¿î ¾î¶² °ÍÀ» ÇÒ´çÇÑ´Ù¸é, »ý¼ºµÇ¾ú´ø ȯ°æÀº À¯È¿±â°£ÀÌ ³¡ÀÌ ³ª¼­ ´õ ÀÌ»ó Á¸ÀçÇÏÁö ¾Ê°Ô µÈ´Ù.

7. ¸®½ºÆ® ó¸®

ÀÌÁ¦±îÁö ¸®½ºÆ®´Â ÇÁ·Î±×·¥À» À§ÇÑ Ç¥ÇöÀ¸·Î¼­¸¸ »ç¿ëÇß´Ù. Lisp ¿¡¼­´Â ÇÁ·Î±×·¥°ú ÀÚ·á (data) ¸ðµÎ ¸®½ºÆ®·Î ³ªÅ¸³¯ ¼ö ÀÖ´Ù. ¿ì¸®´Â Ãß»óÀû ÀÚ·áÇü (abstract data type) À» ±¸ÃàÇÏ°í Lisp ÀúÀå¼ÒÀÇ Ãß»óÈ­¸¦ À§ÇØ ¸®½ºÆ®¸¦ »ç¿ëÇÑ´Ù.

Quote ¸¦ »ç¿ëÇÑ Æò°¡ÀÇ ÁßÁö

¸ð¼øÀûÀ¸·Î µé¸±Áö´Â ¸ð¸£°ÚÁö¸¸ ±âÈ£ Á¶ÀÛÀÇ ¸ñÀûÀ» À§Çؼ­ ±âÈ£´Â °ªÀ» °®Áö ¾Ê¾Æµµ µÈ´Ù. ÇϳªÀÇ ±âÈ£¸¦ ÂüÁ¶Çϱâ À§ÇØ (±×°ÍÀÇ °ªÀ» ÂüÁ¶ÇÏ´Â °ÍÀÌ ¾Æ´Ô) eval ÀÌ Æò°¡¸¦ ÁßÁöÇϵµ·Ï ÇÏ´Â °ÍÀÌ Á¾Á¾ À¯¿ëÇÒ ¶§°¡ ÀÖ´Ù. ÀÌ°ÍÀº Lisp ¿¡¼­ quote ÇÔ¼ö·Î ÀÌ·ç¾îÁø´Ù. Quote ¹®Àº Lisp ÇÁ·Î±×·¥¿¡¼­ ¸Å¿ì ÀÚÁÖ ¾²À̱⠶§¹®¿¡ Æí¸®ÇÑ »ý·«ÇüÀÌ ÀÖ´Ù. 'expression Àº (quote expression) ÀÇ »ý·«ÇüÀÌ´Ù. quote ´Â ¾î¶² ½ÄÀÌ¶óµµ eval ·Î ÇÏ¿©±Ý ±×°ÍÀÇ Æò°¡¸¦ ÁßÁöÇϵµ·Ï ÇÑ´Ù.

±âÈ£µéÀÌ ¾î¶² °ÍÀÎÁö ¹Ì¸® ¾Ë°í ÀÖ´Ù¸é quote ¸¦ »ç¿ëÇÏ¿© ±× ±âÈ£µéÀÇ ¸®½ºÆ®¸¦ ¸¸µé ¼ö ÀÖ´Ù. ¶ÇÇÑ list ¸¦ »ç¿ëÇÏ¿© ÇÁ·Î±×·¥ ½ÇÇà Áß¿¡ º¸´Ù À¶Å뼺 ÀÖ°Ô ¸®½ºÆ®µéÀ» ¸¸µé ¼ö ÀÖ´Ù.

¸®½ºÆ®¿¡ ¿ø¼Ò¸¦ ¸¸µé°í Á¢±ÙÇϱâ

list ¶ó´Â ÇÔ¼ö´Â ¸®½ºÆ®¸¦ ¸¸µå´Â Æí¸®ÇÑ ¹æ¹ýÀ» Á¦°øÇÑ´Ù. list ´Â ÀÓÀÇÀÇ °³¼öÀÇ Àμö¸¦ ÃëÇؼ­ ±× °ªµéÀÇ ¸®½ºÆ®¸¦ ¸®ÅÏÇÑ´Ù.

first ¶ó´Â ÇÔ¼ö´Â ¸®½ºÆ®ÀÇ Ã¹¹ø° ¿ø¼Ò¿¡ Á¢±ÙÇÒ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù. Second, third, fourth, fifth, sixth, seventh, eighth, night, tenth µµ ¶ÇÇÑ °¢°¢ ÇÑ ¸®½ºÆ®ÀÇ µÎ¹øÀç, ¼¼¹ø°, ³×¹ø°, ´Ù¼¸¹ø°, ¿©¼¸¹ø°, ÀÏ°ö¹ø°, ¿©´ü¹ø°, ¾ÆÈ©¹ø°, ¿­¹ø°ÀÇ ¿ø¼Ò¿¡ Á¢±ÙÇϵµ·Ï ¿©·¯ ´Ù¸¥ Lisp ¹öÀü¿¡¼­ ±¸ÇöµÇ¾î ÀÖ´Ù. º¸´Ù ÀϹÝÀûÀ¸·Î´Â (nth i l) À̶ó´Â °ÍÀÌ ÀÖ¾î ¸®½ºÆ®ÀÇ l ÀÇ i ¹ø° ¿ø¼Ò¸¦ Á¢±ÙÇÒ ¼ö ÀÖ°Ô ÇØÁØ´Ù. ¿©±â¼­ nth ¶ó´Â °ÍÀº 0 À¸·ÎºÎÅÍ ½ÃÀÛÇÏ´Â °ÍÀ̹ǷÎ, ¸®½ºÆ® l ÀÇ Ã¹¹ø° ¿ø¼Ò´Â (nth 0 l) ÀÌ°í, µÎ¹ø°´Â (nth 1 l) ÀÌ·± ½ÄÀ¸·Î °è¼ÓµÈ´Ù.

¿ì¸®´Â first ¿Í rest ¸¦ ÀÌ¿ëÇÏ¿© ¸®½ºÆ®¸¦ ºÐ¸®ÇÒ ¼ö ÀÖ°í, µÎ °³ÀÇ Àμö¸¦ °®´Â cons (constructor ¿¡¼­ À¯·¡) ¸¦ ½á¼­ ´Ù½Ã ÇÕÄ¥ ¼ö ÀÖ´Ù.

´ëºÎºÐÀÇ °æ¿ì¿¡ ÀÖ¾î cons ÀÇ µÎ¹ø° Àμö´Â ¸®½ºÆ®Áö¸¸, ¹Ýµå½Ã ±×·² ÇÊ¿ä´Â ¾ø´Ù.

¸Þ¸ð¸®»óÀÇ ¸®½ºÆ®

Cons ´Â Á¡À¸·Î ¿¬°áµÈ ½Ö (dotted pair) À» ¸¸µå´Âµ¥, ±× ÀÌÀ¯´Â °ð ¾Ë°Ô µÉ °ÍÀÌ´Ù. ±×°ÍÀº µÎ ÀμöÀÇ °ªÀ» ÂüÁ¶ÇÏ´Â µÎ °³ÀÇ Æ÷ÀÎÅ͸¦ À§ÇÑ ÀúÀå¼Ò¸¦ ÇÒ´çÇÑ´Ù.

Á¡À¸·Î ¿¬°áµÈ ½Ö¿¡ ´ëÀÀÇÏ´Â ¸Þ¸ð¸®ÀÇ ±¸Á¶´Â Äܽº¼¿ (cons cell) À̶ó°í ºÒ¸®¿ì°í Æ÷ÀÎÅ͸¦ °¡Áø ¸ÂºÙ¿©Áø ³×¸ðÀÇ ±×¸²À¸·Î ¹¦»çµÈ´Ù. ±×¸² 8 Àº ¾ÕÀÇ ½ÄÀ» Æò°¡ÇÔÀ¸·Î½á ¾òÀº ±¸Á¶¸¦ º¸¿©ÁÖ°í ÀÖ´Ù.

Lisp ¿¡ ´ëÇÑ ´Ù¸¥ Ã¥À» ÀÐÀ» ¶§ car ¿Í cdr À̶õ ÇÔ¼ö¸¦ º¸°Ô µÉÁöµµ ¸ð¸¥´Ù. First ¿Í rest °¡ car ¿Í cdr º¸´Ù ´õ ÆíÇÏ°í ±â¾ïÇϱ⠽¬¿î À̸§ÀÌ´Ù. car ¿Í cdr ÀÇ À̸§Àº Lisp °¡ óÀ½ ¼³°èµÇ¾î ¿î¿ëµÉ ¶§¿¡ ÄÄÇ»ÅÍÀÇ ±â°è ±¸Á¶·Î »ý°Ü³µ´Ù.

 

±×¸² 8  ¸Þ¸ð¸® »óÀÇ ¸®½ºÆ® ±¸Á¶

¸î¸î ÇÁ·Î±×·¡¸ÓµéÀº car ¿Í cdr À̶õ °ídzÀÇ À̸§À» °íÁýÇϴµ¥, ±× ÀÌÀ¯ ÁßÀÇ Çϳª´Â ¿©·¯ car ¿Í cdr µéÀÌ ¿¬¼ÓÀûÀ¸·Î ¿À´Â °æ¿ì¿¡ ¸Å¿ì Æí¸®ÇÑ »ý·«ÇüÀ» Á¦°øÇϱ⠶§¹®ÀÌ´Ù. Lisp ÀÇ ¸¹Àº º¯Çüµé¿¡¼­´Â ¿¬¼ÓµÈ car ¿Í cdr, ¿¹¸¦ µé¾î (car (cdr (car expression))) °ú °°Àº °ÍµéÀ» c[a|d]*r ÀÇ Çü, Áï (cadar expression) ÀÇ ÇüÅ·Π»ý·«ÇÒ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù. ¸¸ÀÏ ÀÌ·¯ÇÑ ÇÔ¼ö°¡ ´ç½ÅÀÇ Lisp ¹öÀü¿¡ ¾øÀ¸¸é ±×°ÍÀ» ½±°Ô Á¤ÀÇÇÒ ¼ö ÀÖ´Ù.

»ç½Ç Lisp ·Î ÇÁ·Î±×·¡¹ÖÇϱâ À§ÇØ ¸Þ¸ð¸®ÀÇ ±¸Á¶¸¦ ¾Ë ÇÊ¿ä´Â ¾ø´Ù. ¸¸ÀÏ ÇÑ ±âÈ£°¡ °¡¸®Å°´Â ¸®½ºÆ®¸¦ º¯ÇüÇÏ°íÀÚ ÇÑ´Ù¸é »õ·Î¿î ¸®½ºÆ®¸¦ ±¸¼ºÇؼ­ ±× ±âÈ£¿¡ »õ·Î¿î ¸®½ºÆ®¸¦ setq ÇÏ¸é µÈ´Ù. ÀÌ·¯ÇÑ ¹æ¹ýÀº Ä¿´Ù¶õ ¸®½ºÆ®¸¦ º¹»çÇÏ°í Áö·çÇÑ ÀâÀÏÀ» ÇÏ´Â µ¥¿¡ »ó´ç·®ÀÇ ½Ã°£À» ¼ÒºñÇÏ´Â °á°ú¸¦ ³º´Â´Ù. ¿¹¸¦ µé¾î »õ·Î¿î ¸®½ºÆ®´Â Àü ¸®½ºÆ®¿Í Çϳª ¶Ç´Â µÎ °³ÀÇ ÀÛÀº Â÷À̸¸ ÀÖÀ» °ÍÀ̹ǷΠ°ÅÀÇ µ¿ÀÏÇÒ °ÍÀε¥µµ Àü ¸®½ºÆ®ÀÇ ´ëºÎºÐÀ» ´Ù½Ã ±¸¼ºÇØ¾ß ÇÒ °ÍÀÌ´Ù. °Ô´Ù°¡ ¸¸ÀÏ µÎ °³ÀÇ ±âÈ£°¡ °°Àº ¸®½ºÆ®¸¦ °¡¸®Å°°Å³ª, ÇÑ ±âÈ£°¡ ´Ù¸¥ ±âÈ£°¡ °¡¸®Å°´Â ¸®½ºÆ®ÀÇ ÇϺÎÇ¥Çö (subexpression) À» °¡¸®Å°¸é ±×¿¡ ¾Ë¸Âµµ·Ï ´ëóÇØ¾ß ÇÒ °ÍÀÌ´Ù. ¸Þ¸ð¸®ÀÇ ³»¿ëÀ» Á÷Á¢ÀûÀ¸·Î º¯°æÇÔÀ¸·Î½á ¿ì¸®´Â ºÒÇÊ¿äÇÑ º¹Á¦³ª ±â·ÏÀ» ÇÇÇÒ ¼ö ÀÖ´Ù.

¸Þ¸ð¸®»óÀÇ ¸®½ºÆ® ±¸Á¶ º¯°æ

Lisp ´Â ¸Þ¸ð¸®ÀÇ ³»¿ëÀ» ¹Ù²ÞÀ¸·Î½á ±âÁ¸ÀÇ ¸®½ºÆ® ±¸Á¶¸¦ º¯°æÇÒ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù. Setf ´Â ±âÈ£°ª¿¡ ÀÇÇÑ ÂüÁ¶³ª first, rest ÀÇ È£Ãâ¿¡ ÀÇÇؼ­ Á¦°øµÇ´Â ¸Þ¸ð¸® »óÀÇ À§Ä¡¿Í ÇϳªÀÇ ½ÄÀ» Àμö·Î ÃëÇؼ­ ±× À§Ä¡»ó¿¡ ÀÖ´Â °ÍÀ» ½ÄÀÇ °ªÀ¸·Î ¹Ù²Û´Ù. Self ´Â ù¹ø° Àμö¸¦ Æı«ÀûÀ¸·Î º¯°æÇÑ´Ù.

Self ´Â setq º¸´Ù ´õ ÀϹÝÀûÀÌÁö¸¸ setq ´Â ¾ÆÁ÷µµ ±âÈ£°¡ º¹ÀâÇÑ ¸Þ¸ð¸® º¯°æÀÌ ¾Æ´Ï¶ó ±×³É °ªÀ» ÁöÁ¤ÇÏ´Â °ÍÀ̶ó´Â °ÍÀ» ³ªÅ¸³»´Â ¹®¼­È­ÀÇ ¸ñÀûÀ¸·Î ¾²ÀÌ°í ÀÖ´Ù. self ´Â ºÎÁÖÀÇÇÏ°Ô »ç¿ëµÇ¸é °¡²û ÇÁ·Î±×·¥¿¡¼­ ¹Î°¨ÇÑ ¿À·ù¸¦ À¯¹ßÇÒ ¼ö Àֱ⠶§¹®¿¡ ÁÖÀÇÇØ¾ß ÇÑ´Ù. Self ´Â Ç¥Çö»óÀÇ ¸ñÀûÀ¸·Î À¯¿ëÇÑ ¼øȯÀûÀÎ ¸®½ºÆ® ±¸Á¶¸¦ ¸¸µé ¼ö ÀÖ°Ô ÇØÁØ´Ù. ±×·¯³ª, ±×·¯ÇÑ ±¸Á¶¸¦ ÇÁ¸°Æ®ÇÒ ¶§¿¡´Â Á¶½ÉÇÏÁö ¾ÊÀ¸¸é ¾ÈµÈ´Ù.

ÀÌ È£Ãâ¿¡ ÀÇÇÑ Çؼ®±âÀÇ ½ÇÇàÀº ÁߴܵǾî¾ß ÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸é ³¡¾øÀÌ ÇÁ¸°ÆÃÀ» °è¼ÓÇÒ °ÍÀÌ´Ù. ±×¸² 9 ´Â °á°ú·Î ³ª¿Â ±¸Á¶¸¦ ±×¸²À¸·Î º¸¿©ÁÖ°í ÀÖ´Ù. Common Lisp ´Â ¼øȯÀûÀÎ ¸®½ºÆ® ±¸Á¶¸¦ ¾Ë¸Â°Ô Ãâ·ÂÇϱâ À§ÇÑ ÇÁ·Î½ÃÀú¸¦ Æ÷ÇÔÇÏ°í ÀÖ´Ù.

 

±×¸² 9  ¸Þ¸ð¸® »óÀÇ ¸®½ºÆ® ±¸Á¶ÀÇ º¯°æ

Àμö Àü´ÞÀÇ ´Ù¸¥ ¹æ¹ý

Çؼ®±â¿ÍÀÇ ´ÙÀ½ ´ëÈ­¿¡¼­ ¼³¸íµÇµíÀÌ Lisp ´Â °ª¿¡ ÀÇÇÑ È£Ãâ (call-by-value) ·Î Àμö¸¦ Àü´ÞÇÑ´Ù.

¿ì¸®´Â Æ÷ÀÎÅÍ¿Í self ¸¦ »ç¿ëÇÏ¿© ´Ù¸¥ Àμö Àü´Þ ¹æ¹ýµéÀ» Èä³»³¾ ¼ö ÀÖ´Ù. ´ÙÀ½Àº ÂüÁ¶¿¡ ÀÇÇÑ È£Ãâ (call-by-reference) ¹æ½ÄÀ» Èä³»³»´Â ¹æ¹ýÀ» ¼³¸íÇÑ´Ù.

±×·¯³ª Lisp ¿¡´Â ±âÈ£¸¦ ÂüÁ¶¿¡ ÀÇÇÑ È£ÃâÀ» ÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀº ¾ø´Ù.

¸®½ºÆ®¿¡ °üÇÑ ¼ú¾î

Lisp ´Â ¸®½ºÆ®¿¡ ´ëÇÑ Å×½ºÆ®¸¦ ¼öÇàÇϱâ À§ÇÑ ´Ù¾çÇÑ ºÎ¿ï ¼ú¾î (boolean predicate) ¸¦ °¡Áö°í ÀÖ´Ù. listp ´Â ¸®½ºÆ®¿¡ ´ëÇؼ­, consp ´Â Á¡À¸·Î ¿¬°áµÈ ¦µé (dotted pair) ¿¡ ´ëÇؼ­, null Àº °ø¹é ¸®½ºÆ® nil ¶Ç´Â ( ) ¿¡ ´ëÇؼ­ Å×½ºÆ®¸¦ ÇÑ´Ù. ¸®½ºÆ®ÀÇ ±¸Á¶¸¦ ºñ±³Çϱâ À§ÇÑ °ÍÀ¸·Î eq ¿Í equal ÀÌ ÀÖ´Ù. eq ´Â µÎ °³ÀÇ Àμö°¡ ¸Þ¸ð¸®»óÀÇ °°Àº À§Ä¡¸¦ °¡¸®Å°´Â°¡¸¦ °áÁ¤ÇÑ´Ù. Nil °ú ( ) ´Â eq ÀÌ´Ù. Equal Àº µÎ °³ÀÇ Àμö°¡ ±¸Á¶ÀûÀ¸·Î ºñ½ÁÇÑ°¡¸¦ °áÁ¤ÇÑ´Ù.

¸®½ºÆ® Á¶ÀÛ ³»ºÎ ÇÔ¼ö

¸®½ºÆ®¸¦ ´Ù·ç´Â ÇÔ¼öµé Áß¿¡¼­ append ´Â ¸®½ºÆ®·Î Æò°¡µÇ´Â 0 °³ ÀÌ»óÀÇ Àμö¸¦ ÃëÇؼ­ ±×µé ¸®½ºÆ® ¾È¿¡ ÀÖ´Â ¸ðµç ¿ø¼Ò·Î ÀÌ·ç¾îÁø »õ·Î¿î ¸®½ºÆ®¸¦ ¸®ÅÏÇÑ´Ù. Nconc ´Â ¸¶Áö¸· ¿ø¼Ò¸¦ Á¦¿ÜÇÑ ¸ðµç Àμö¸¦ Æı«ÀûÀ¸·Î º¯°æÇÑ´Ù´Â Á¡À» Á¦¿ÜÇÏ°í´Â append ¿Í ºñ½ÁÇÏ´Ù.

Reverse ´Â ÇϳªÀÇ ¸®½ºÆ®¸¦ Àμö·Î ÃëÇؼ­ ±×°ÍÀÇ ¿ª¼øÀ¸·Î ¹è¿­µÈ ¿ø¼Òµé·Î ÀÌ·ç¾îÁø »õ·Î¿î ¸®½ºÆ®¸¦ ¸®ÅÏÇÑ´Ù. member ´Â ÀÓÀÇÀÇ Lisp °´Ã¼¿Í ¸®½ºÆ®¿¡ ÇØ´çÇÏ´Â µÎ °³ÀÇ Àμö¸¦ ÃëÇÏ´Â ¸Å¿ì À¯¿ëÇÑ Lisp ÇÔ¼öÀÌ´Ù. ù¹ø° Àμö¿¡ ÇØ´çÇÏ´Â °´Ã¼°¡ µÎ¹ø°¿¡ ÇØ´çÇÏ´Â ¸®½ºÆ®ÀÇ ¿ø¼ÒÀ̸é member ´Â ±× ¸®½ºÆ®¿¡¼­ °´Ã¼¿Í eq °ü°èÀΠù¹ø° ¿ø¼Ò·ÎºÎÅÍ ½ÃÀÛÇÏ´Â ¸®½ºÆ® (²¿¸®¿¡ ÇØ´çÇÏ´Â) ¸¦ ¸®ÅÏÇÑ´Ù. ¸¸ÀÏ ±× °´Ã¼°¡ ¸®½ºÆ®ÀÇ ¿ø¼Ò°¡ ¾Æ´Ï¸é member ´Â nil À» ¸®ÅÏÇÑ´Ù.

¼±Åà »ç¾çÀ¸·Î¼­ÀÇ Àμö

Common  Lisp ÀÇ ¸¹Àº ÇÔ¼öµéÀº Å°¿öµå·Î ³¢¿ö ³ÖÀ» ¼ö ÀÖ´Â ÇÔ¼ö¸¦ ¼±Åà »ç¾çÀÇ Àμö·Î ÃëÇÏ°í ÀÖ´Ù. Å°¿öµå´Â ù¹ø° ¹®ÀÚ°¡ ÄÝ·Ð (¿¹¸¦ µé¾î, :test) ÀÎ ±âÈ£·Î¼­ Àμö ¸®½ºÆ®¿¡ ³ªÅ¸³­´Ù. ¿¹¸¦ µé¾î, ¾Õ¿¡¼­ member ´Â ¸®½ºÆ®¿¡ ÀÖ´Â °´Ã¼¸¦ Å×½ºÆ®Çϱâ À§Çؼ­ eq ¸¦ ¾´´Ù°í Çß´Ù. ¸¸ÀÏ (member x l) À̶ó°í ¾²´Â ´ë½Å¿¡ (member x l :test #'equal) À̶ó°í ¾´´Ù¸é, member ´Â eq ´ë½Å¿¡ equal ¸¦ »ç¿ëÇÏ¿© Å×½ºÆ®¸¦ ÇÒ °ÍÀÌ´Ù. ¶ÇÇÑ Å×½ºÆ® ¹æ¹ýÀ¸·Î¼­ lambda ÇÔ¼ö¸¦ ¼­¼úÇÒ ¼öµµ ÀÖ´Ù.

¸®½ºÆ® ó¸® ¿¹

»õ·Î¿î ¸®½ºÆ® ó¸® ¹æ¹ýÀ» »ç¿ëÇÏ¿© ÀÌÁ¦ ÇϳªÀÇ ¼ýÀÚ½Ö (¿¹¸¦ µé¾î, (1 2)) °ú ¼ýÀÚ ½ÖÀÇ ¸®½ºÆ® (¿¹¸¦ µé¾î, ((1 2) (2 4) (4 8))) ÀÇ µÎ °³ÀÇ Àμö¸¦ °¡Áø insert ¶ó´Â ÇÔ¼ö¸¦ Á¤ÀÇÇÑ´Ù. ½ÖÀÇ ¸®½ºÆ®´Â °¢ ½ÖÀÇ Ã¹¹ø° ¿ø¼ÒÀÇ Å©±â¿¡ ÀÇÇؼ­ ÀÛÀº ¼ö°¡ ¾Õ¿¡ ¿Àµµ·Ï Á¤·ÄµÇ¾î ÀÖ´Ù°í ÇÏÀÚ. ¼ýÀÚ½ÖÀÇ ¸®½ºÆ®´Â x ¿Í f(x) ÀÇ ¼ýÀÚ½ÖÀÇ ÇüŸ¦ °¡Áø »ùÇÃÀ» Ç¥ÇöÇÑ´Ù. ¿©±â¼­ f(x) ´Â ÇϳªÀÇ º¯¼ö¸¦ °®´Â ½ºÄ®¶ó (scalar) ÇÔ¼öÀÌ´Ù. ù¹ø° ¿ø¼Ò°¡ °°Àº µÎ ½ÖÀ» ¸®½ºÆ®¿¡ Æ÷ÇÔÇÒ ÇÊ¿ä´Â ¾ø´Ù. ±× ½ÖµéÀÌ °°Àº ÇÔ¼ö¿¡¼­ ¿Â °ÍÀÌ°í µÎ ½ÖÀÇ Ã¹¹ø° ¿ø¼Ò°¡ °°´Ù¸é (=), µÎ¹ø° ¿ø¼Òµéµµ ¿ª½Ã °°°í µÎ ½ÖÀº equal ÀÏ °ÍÀÌ´Ù. Insert ´Â ù¹ø° ÀμöÀÇ ½ÖÀ» »õ·Î Æ÷ÇÔÇÏ´Â Á¤·ÄµÈ ¸®½ºÆ®¸¦ »ý¼ºÇÑ´Ù. ÀÌ°ÍÀº first ¿Í rest ·Î ¸®½ºÆ®¸¦ ºÐ¸®ÇÏ°í, ÇÊ¿äÇÑ °÷¿¡ »õ·Î¿î ½ÖÀ» »ðÀÔÇÏ°í, ´Ù½Ã cons ·Î ÀÌÀ½À¸·Î½á ¸¸µé°Ô µÈ´Ù.

Insert ´Â µÎ¹ø°ÀÇ Àμö¿¡ ÇØ´çÇÏ´Â ¸®½ºÆ®°¡ nil ÀÏ ¶§±îÁö ±× ¸®½ºÆ®ÀÇ rest ¿¡ ÀÚ±â ÀÚ½ÅÀ» Àç±ÍÀûÀ¸·Î Àû¿ëÇÑ´Ù. º¹ÀâÇÏ°Ô ÁßøµÈ ¸®½ºÆ® ±¸Á¶·Î µÇ¾îÀÖ´Â ÀμöÀÇ first ¿Í rest ¸ðµÎ¿¡ Àç±ÍÀûÀ¸·Î È£ÃâÇÏ´Â ¹æ¹ýÀº Á¾Á¾ À¯¿ëÇÏ°Ô »ç¿ëµÈ´Ù. ´ÙÀ½ ÇÔ¼ö´Â ¸®½ºÆ®ÀÇ first ¿Í last ¸ðµÎ Àç±ÍÀûÀΠȣÃâÀ» ÇÏ¿© ÁÖ¾îÁø ±âÈ£ÀÇ ¸ð¾çÀ» Å×½ºÆ®ÇÏ´Â °ÍÀÌ´Ù.

ÀÌÁ¦ ¼ýÀÚ¿Í ¼ýÀÚ½ÖÀÇ ¸®½ºÆ®¸¦ ÀÔ·ÂÀ¸·Î ¹Þ¾Æ ±× ¼ýÀÚ°¡ ½ÖµéÀÇ Ã¹¹ø° ¿ø¼Òµé Áß °¡Àå Å« °Íº¸´Ù Å©°Å³ª °¡Àå ÀÛÀº °Íº¸´Ù ÀÛÀ¸¸é nil À» ¸®ÅÏÇÏ´Â ÇÔ¼ö¸¦ Á¤ÀÇÇÑ´Ù. ¸¸ÀÏ ½Ö Áß¿¡¼­ ù¹ø° ¿ø¼Ò°¡ ÁÖ¾îÁø ¼ýÀÚ¿Í °°Àº (=) °ÍÀÌ ÀÖÀ¸¸é, ±× ÇÔ¼ö´Â ±× ½ÖÀ¸·Î ÀÌ·ç¾îÁø ¸®½ºÆ®¸¦ ¸®ÅÏÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸é, ±× ÇÔ¼ö´Â µÎ °³°¡ ¿¬¼ÓÀûÀ¸·Î Á¸ÀçÇÏ´Â µÎ ½Ö Áß¿¡¼­ ¾Õ ½ÖÀÇ Ã¹¹ø° ¿ø¼Ò´Â ±× ¼ýÀÚº¸´Ù ÀÛ°í, µÚ ½ÖÀÇ Ã¹¹ø° ¿ø¼Ò´Â ±× ¼ýÀÚº¸´Ù Å« °ÍÀ» ½ÖÀ¸·Î ¸¸µé¾î ¸®ÅÏÇÑ´Ù (Áï, ((1 2) (3 6))).

Áö¿ª»óÅ (local state) ¸¦ »ç¿ëÇÑ ¿¹¿¡¼­¿Í °°ÀÌ ÀڷḦ °è¼Ó ±â¾ïÇϸ鼭 °è»êÇÏ´Â µÎ ÇÔ¼ö¸¦ Á¤ÀÇÇÑ´Ù. Remember ´Â ÇÔ¼ö f ¿¡ ´ëÇÑ (x f(x)) ÇüÅÂÀÇ ¼ýÀÚ½ÖÀ» ±â¾ïÇÑ´Ù. ƯÁ¤ x °ª¿¡ ´ëÇÑ f(x) ÀÇ Æò°¡°ªÀ» °è»êÇØ¾ß ÇÒ ¶§ estimate ´Â x °¡ µ¥ÀÌÅÍÀÇ ¹üÀ§¸¦ ¹þ¾î³ª¸é °æ°íÇÏ°í, (x f(x)) ÀÇ ½ÖÀ» ÀúÀåÇÏ°í ÀÖÀ¸¸é f(x) ÀÇ °ªÀ» ¸®ÅÏÇÏ°í, ±×·¸Áö ¾ÊÀ¸¸é ¾Õ¿¡¼­ ¼³¸íÇÑ ¼±Çü º¸°£¹ý (linear interpolation) À» È£ÃâÇÑ´Ù. ±×¸² 10 Àº µÎ ÇÔ¼öÀÇ Äڵ带 º¸¿©ÁÖ°í ÀÖ´Ù.

;; Áö¿ª »óÅ º¯¼ö¿¡ ÀÖ´Â ÀڷḦ ÃßÀûÇÑ´Ù.

(let ((data ()))

   ;; ±âÁ¸ÀÇ ÀÚ·á ÁýÇÕ¿¡ »õ·Î¿î ÀڷḦ Ãß°¡ÇÑ´Ù.

   (defun remember (x y)

       (setq data (insert (list x y) data)))

   ;; ÀڷḦ ±â¹ÝÀ¸·Î Æò°¡¸¦ ÇÑ´Ù.

   (defun estimate (x)

       (let ((pairs (nearest-pairs x data)))

          (cond ((null pairs) "Outside range!")

                   ((null (ret pairs)) (second (first pairs)))

                   (t (interpolate (first (first pairs))

                                              (second (first pairs))

                                              (first (second pairs))

                                              (second (second pairs)) x)))))))

±×¸² 10  ÀڷḦ ±â¾ïÇÏ°í Æò°¡Çϱâ À§ÇÑ ÇÔ¼öµé

ÀÚ·á Ãß»óÈ­

cons ¿Í list ¸¦ »ç¿ëÇÏ¿© ÀÓÀÇÀÇ ÀÚ·á ±¸Á¶¸¦ ±¸ÃàÇÏ°í first ¿Í rest ·Î ±×°ÍµéÀº ÂüÁ¶ÇÒ ¼ö ÀÖ°í self ·Î ±×°ÍµéÀ» º¯°æÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª, ±×·¸°Ô ±¸ÇöµÈ º¹ÀâÇÑ ÀÚ·á ±¸Á¶´Â ÀÌÇØÇϱâ Èûµç Äڵ带 À¯¹ßÇÏ´Â °æÇâÀ» º¸ÀδÙ. ´ëºÎºÐÀÇ ÇÁ·Î±×·¡¸Ó´Â ÀÚ·á ±¸Á¶°¡ ¾î¶»°Ô ±¸¼ºµÇ¾î ÀÖ´ÂÁö¿¡ ´ëÇÑ »ó¼¼ÇÑ ºÎºÐÀ» ¼û±â´Â ÀÚ·á Ãß»óÈ­ (data abstraction) ¸¦ ¼³°èÇÏ°Ô µÈ´Ù. ÀÌ°ÍÀº ¿©·¯ ¸íÀÇ ÇÁ·Î±×·¡¸Ó¿¡°Ô ±¸ÇöÀ» ÇØ¾ß ÇÑ´Ù´Â ºÎ´ã°ú ±× ±¸ÇöÀÌ ÇԺηΠº¯°æµÉ °ÍÀ̶ó´Â °ÆÁ¤À» ¾ø¾ÖÁØ´Ù.

¸íĪÀÌ ºÙÀº ÀÌÁøÆ®¸® (labeled binary tree) ¸¦ Á¶ÀÛÇÏ´Â ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ°í ÀÖ´Ù°í °¡Á¤ÇÏÀÚ. Cons, first, rest ¿Í °°Àº ±âÃÊÀûÀÎ ÇÔ¼öµé·Î ÀÌÁøÆ®¸®¸¦ Á¶ÀÛÇÏ´Â °Í ´ë½Å¿¡ ¿ì¸®°¡ Á¤ÀÇÇÏ°í ±â¾ïÇϱ⠽¬¿î À̸§À» °¡Áø ÇÔ¼ö¸¦ »ç¿ëÇÑ ÀÚ·á Ãß»óÈ­¸¦ ¼³°èÇÏÀÚ. ±×¸² 11 Àº ¸íĪÀÌ ºÙÀº ÀÌÁøÆ®¸®ÀÇ »ç·Ê (instance) ¸¦ »ý¼º, Å×½ºÆ®, Á¢±Ù, º¯°æÇÏ´Â ¿¬»êÀ» °¡Áø Ãß»óÀû ÀÚ·áÇüÀ» Á¤ÀÇÇÏ´Â ÇÔ¼ö¸¦ º¸¿©ÁÖ°í ÀÖ´Ù.

;; ¸íĪÀÌ ºÙÀº ÀÌÁøÆ®¸®ÀÇ ÀνºÅϽº¸¦ Çϳª »ý¼ºÇÑ´Ù.

(defun make-TREE (label left right)

     (list 'labeled-binary-tree label left right))

;; ÇϳªÀÇ °³Ã¼°¡ ¸íĪÀ» °¡Áø ÀÌÁøÆ®¸®Àΰ¡¸¦ °áÁ¤ÇÑ´Ù.

(defun is-TREE (x)

     (and (listp x) (eq (first x) 'labeled-binary-tree)))

;; ¸íĪÀ» °¡Áø ÀÌÁøÆ®¸®ÀÇ ¸íĪÀ» ¸®ÅÏÇÑ´Ù.

(defun TREE-label (tree) (second tree))

;; ¸íĪÀ» °¡Áø ÀÌÁøÆ®¸®ÀÇ ¿ÞÂÊ °¡Áö (branch) ¸¦ ¸®ÅÏÇÑ´Ù.

(defun TREE-left (tree) (third tree))

;; ¸íĪÀ» °¡Áø ÀÌÁøÆ®¸®ÀÇ ¿À¸¥ÂÊ °¡Áö¸¦ ¸®ÅÏÇÑ´Ù.

(defun TREE-right (tree) (fourth tree))

;; ¸íĪÀ» °¡Áø ÀÌÁøÆ®¸®ÀÇ ¸íĪÀ» ÁöÁ¤ÇÑ´Ù.

(defun set-TREE-label (tree value)

     (self (second tree) value))

±×¸² 11  ¸íĪÀÌ ºÙÀº ÀÌÁøÆ®¸®¸¦ À§ÇÑ Ãß»óÀû ÀÚ·áÇü

Ãß»óÀû ÀÚ·áÇüÀ» Æ÷ÇÔÇÏ´Â Äڵ带 º¸´Ù ½±°Ô Àбâ À§Çؼ­ Ãß»óÀû ÀÚ·áÇüÀ» Á¤ÀÇÇÏ´Â µ¥¿¡ ¸î °¡ÁöÀÇ °ü·Ê°¡ ÀÖ´Ù. TYPE À̶ó´Â Ãß»óÀû ÀÚ·áÇüÀ» ¸¸µé°í ½Í´Ù°í °¡Á¤ÇÏÀÚ. TYPE ÀÇ »ç·Ê¸¦ ¸¸µé±â À§ÇÑ ÇÔ¼ö´Â make-TYPE À̶ó°í ºÒ¸®¿öÁú °ÍÀÌ´Ù. ÀÓÀÇÀÇ Lisp °´Ã¼°¡ TYPE ÀÇ »ç·ÊÀÎÁö¸¦ Å×½ºÆ®ÇÏ´Â ÇÔ¼ö´Â is-TYPE À̶ó°í ºÎ¸¥´Ù. ¸¸ÀÏ ±× ÀÚ·áÇüÀÌ slot À̶ó°í ºÒ¸®¿ì´Â ¾î¶² ³»ºÎ ±¸Á¶¿¡ ´ëÇÑ Á¢±ÙÀ» Çã¿ëÇÑ´Ù¸é ±× Á¢±Ù ÇÔ¼ö´Â TYPE-slot À̶ó°í ºÎ¸¥´Ù. slot ¿¡ ÀÇÇؼ­ ½Äº°µÈ ³»ºÎ ±¸Á¶°¡ º¯°æµÉ ¼ö ÀÖ´Â °ÍÀ̸é, ±× º¯°æÇÏ´Â ÇÔ¼ö´Â set-TYPE-slot À̶ó°í ºÎ¸¥´Ù. ºñ·Ï Lisp °¡ ÀϹÝÀûÀ¸·Î´Â ´ë¹®ÀÚ¿Í ¼Ò¹®ÀÚ¸¦ ±¸º°ÇÏÁö ¾ÊÁö¸¸, Lisp Äڵ带 Ç¥½ÃÇÏ´Â µ¥¿¡ À־ ¿ì¸®´Â Ãß»óÀû ÀÚ·áÇüÀ» °¡¸®Å°´Â µ¥¿¡ ±×°Í ÀÚü°¡ ¼Ò¹®ÀÚ¸¦ Æ÷ÇÔÇÏ°í ÀÖ´Â °æ¿ì´Â Á¦¿ÜÇÏ°í´Â ´ë¹®ÀÚ¸¦ »ç¿ëÇÑ´Ù. ÀÌ·¯ÇÑ °ü·Ê´Â Lisp Äڵ带 º¸´Ù ÀÌÇØÇϱ⠽±°Ô ¸¸µé±â À§ÇÑ °ÍÀÌ´Ù.

ÀÚ·á Ãß»óÈ­¸¦ »ý¼ºÇÏ°í ³­ ÈÄ »ó¼¼ÇÑ ºÎºÐ¿¡ ´ëÇؼ­´Â Àؾî¹ö¸®°í ±× Ãß»óÈ­µÈ °ÍÀ» »ç¿ëÇÏ¿© ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. ±×¸² 12 ´Â ¸íĪÀÌ ºÙÀº ÀÌÁøÆ®¸®¿¡¼­ ¸íĪÀ» º¯°æÇÏ´Â ÇÔ¼ö¸¦ º¸¿©ÁÖ°í ÀÖ´Ù. TREE-sub ´Â ¿¬¼ÓÀûÀÎ ½ÄµéÀ» ÇϳªÀÇ Çü½ÄÀ¸·Î ¸ðÀ¸´Â Lisp ±¸Á¶ÀÎ progn À» »ç¿ëÇÑ´Ù. Eval Àº progn ¾È¿¡ ÀÖ´Â °¢°¢ÀÇ ½ÄÀ» Â÷·Ê·Î Æò°¡ÇÏ°í ¸¶Áö¸· °ÍÀÇ °ªÀ» ¸®ÅÏÇÑ´Ù.

;; tree ÀÇ old ¸¦ new ·Î ġȯÇÑ´Ù.

(defun TREE-sub (tree old new)

     ;; tree °¡ ¾Æ´Ï¸é, ¾Æ¹«°Íµµ ÇÏÁö ¾Ê´Â´Ù.

     (if (is-TREE tree)

         ;; ¿ä±¸µÈ ġȯÀ» ¼öÇàÇÑ´Ù.

         (progn (if (eq old (TREE-label tree))

                       (set-TREE-label tree new))

                       ;; ¿ÞÂÊ°ú ¿À¸¥ÂÊ °¡Áö¿¡ Àç±ÍÀûÀ¸·Î Àû¿ëÇÑ´Ù.

                       (TREE-sub (TREE-left tree) old new)

                       (TREE-sub (TREE-right tree) old new))))

±×¸² 12  ÀÌÁøÆ®¸®¿¡¼­ ¸íĪÀ» º¯°æÇÏ´Â ÇÁ·Î±×·¥

¿©±â¿¡ ÇϳªÀÇ ¸íĪÀÌ ºÙÀº ÀÌÁøÆ®¸®¸¦ »ý¼ºÇÏ°í ¸íĪÀ» ġȯÇϱâ À§Çؼ­ TREE-sub ¸¦ »ç¿ëÇÏ´Â ¿¹°¡ ÀÖ´Ù.

±×¸² 13  ¸íĪÀ» °¡Áø ÀÌÁøÆ®¸®ÀÇ ¸íĪÀÌ Ä¡È¯µÇ±â Àü°ú ġȯµÈ ÈÄÀÇ ¸ð¾ç

±×¸² 13 Àº ÀÌ·¯ÇÑ È£Ãâ¿¡ »ý¼ºµÈ Ãß»óÀû ÀÚ·áÇüÀÇ »ç·Ê¿Í ¸íĪ ġȯÀ¸·ÎºÎÅÍÀÇ º¯È­¸¦ ¼³¸íÇÏ°í ÀÖ´Ù.

ÀÌ Àå¿¡¼­´Â Lisp °¡ Á¦°øÇÏ´Â ¼øÂ÷ÀûÀÎ ±â´É°ú ÀÚ·á Ãß»óÈ­ ±â´ÉÀ» ´ë·«ÀûÀ¸·Î¸¸ ¼³¸íÇÑ´Ù. Common Lisp °ú ±×°ÍÀÇ È®ÀåµÈ ¹öÀü¿¡¼­´Â Å« ÇÁ·Î±×·¥À» ±¸¼ºÇÏ°í º¹ÀâÇÑ ÀÚ·áÇüÀ» ´Ù·ç±â À§ÇÑ ´Ù¾çÇÑ ±â¼úÀ» Æ÷ÇÔÇÏ°í ÀÖ´Ù. Lisp ´Â Ãß»óÈ­¸¦ ÅëÇÏ¿© ½ÇÇèÇÏ´Â µ¥¿¡ ÈǸ¢ÇÑ È¯°æÀ» Á¦°øÇÑ´Ù. Lisp °¡ ¿µÇâÀ» Å©°Ô ³¢Ä£ ÇÑ ºÐ¾ß¸¦ ²Å´Â´Ù¸é °´Ã¼ÁöÇâ ÇÁ·Î±×·¡¹Ö (object-oriented programming) ¿¡ ´ëÇÑ »ó´ç·®ÀÇ ¿¬±¸°¡ Lisp ¸¦ »ç¿ëÇÏ¿© ÇàÇØÁ³´Ù´Â °ÍÀÌ´Ù. ¿À´Ã³¯, Common Lisp ¾È¿¡¼­µµ °´Ã¼ÁöÇâ ÇÁ·Î±×·¡¹ÖÀ» À§ÇØ ¸¹Àº ±â´ÉÀÌ Á¦°øµÇ°í ÀÖ´Ù.

8. ¹Ýº¹ ±¸Á¶

¾Õ Àý¿¡¼­ Àç±Í È£Ãâ¿¡ ´ëÇÑ °­Á¶¸¦ ÇßÁö¸¸, Lisp ÇÁ·Î±×·¡¹Ö¿¡¼­ ´Ù¸¥ ¹Ýº¹ ±¸Á¶ Çü½ÄÀ» »ç¿ëÇÏ´Â °ÍÀ» ¸»¸®Áö´Â ¾Ê´Â´Ù. ´ÜÁö, Àç±ÍÀûÀΠǥÇöÀÌ °¡Àå ÀÚ¿¬½º·¯¿î ÇüÅ·ΠǥÇöµÇ´Â ³í¸® (logic) ¿Í ³í¸® ÇÁ·Î±×·¡¹Ö (logic programming) ¿¡ ´ëÇÑ Áö½ÄÀ» °¡´ÉÇϸé ÀÌ¿ëÇÏ°íÀÚ ÇÏ´Â °ÍÀÌ´Ù. Common Lisp ´Â ¹Ýº¹À» À§ÇÑ ´Ù¾çÇÑ ±¸Á¶¸¦ Á¦°øÇÑ´Ù. °è¼ÓÇؼ­ ´ÙÀ½ Àå¿¡¼­ »ç¿ëÇÏ°Ô µÉ ±¸Á¶¿¡ ´ëÇؼ­ ¼­¼úÇÑ´Ù.

ÇÔ¼ö¸¦ °¢ Àμö¿¡ ´ëÀÀÇϱâ

Á¾Á¾ °°Àº ¿¬»êÀ» ¸®½ºÆ®¿¡ ÀÖ´Â ¸ðµç ±¸¼º¿ä¼Ò¿¡ Àû¿ëÇÏ´Â °ÍÀÌ Æí¸®ÇÒ ¶§°¡ ÀÖ´Ù. Lisp Àº ÀÌ°ÍÀ» À§Çؼ­ ´Ù¾çÇÑ ´ëÀÀ ±¸Á¶ (mapping construct) ¸¦ Á¦°øÇÏ°í ÀÖ´Ù. Mapcar Àº ù¹ø° Àμö¸¦ ´ÙÀ½¿¡ ¿À´Â ¸®½ºÆ®µé¿¡ ´ëÇØ °¢±â ´ëÀÀµÇ´Â ¿ø¼Òµé³¢¸® Àû¿ëÇÏ¿© ±× °á°úµéÀÇ ¸®½ºÆ®¸¦ ¸®ÅÏÇÑ´Ù. ¿©±â¿¡ ¼ýÀÚµéÀÇ ¸®½ºÆ®·Î Ç¥ÇöµÈ µÎ º¤ÅÍÀÇ ÇÕÀ» °è»êÇÏ´Â °£´ÜÇÑ ¹æ¹ýÀÌ ÀÖ´Ù.

Mapc ´Â °á°ú¿¡ ´ëÇؼ­ ¾Æ¹«°Íµµ ÇÏÁö ¾Ê´Â´Ù´Â °Í ¿Ü¿¡´Â mapcar ¿Í ºñ½ÁÇÏ´Ù. Mapc ´Â ´ÜÁö ºÎÀÛ¿ë (side effect) ¸¸À» À§Çؼ­ »ç¿ëµÈ´Ù. Mapcan Àº nconc ¸¦ ÀÌ¿ëÇÏ¿© °á°ú¸¦ µ¡ºÙÀÌ´Â °Í ¿Ü¿¡´Â mapcar ¿Í ºñ½ÁÇÏ´Ù.

Reduce ´Â ÀÌÁø¿¬»ê¿¡ ÇØ´çÇÏ´Â ÇÔ¼ö¿Í ÇϳªÀÇ ¸®½ºÆ®¸¦ Àμö·Î ÃëÇؼ­ ÀÌÁø¿¬»êÀ» »ç¿ëÇÏ¿© ¸®½ºÆ®ÀÇ ¿ø¼ÒµéÀ» °áÇÕÇÑ´Ù. ´ÙÀ½¿¡ reduce ¸¦ ¼³¸íÇÏ´Â µÎ ¿¹°¡ ÀÖ´Ù.

ù¹ø° ¿¹´Â ¼ýÀÚµéÀÇ ¸®½ºÆ®ÀÇ ÇÕÀ» °è»êÇÑ´Ù. µÎ¹ø° ¿¹´Â º¤Å͵éÀÇ ¸®½ºÆ®ÀÇ ÇÕÀ» °è»êÇÑ´Ù. ù¹ø° °æ¿ì¿¡´Â (apply #'+ '(1 2 3) À» »ç¿ëÇصµ µÈ´Ù.

ÀϹÝÀûÀÎ ¹Ýº¹

do ±¸Á¶´Â Common Lisp ¿¡¼­ °¡Àå ³Î¸® ¾²ÀÌ´Â ¹Ýº¹ ±¸Á¶ ÁßÀÇ ÇϳªÀÌ´Ù. ÀϹÝÀûÀÎ Çü½ÄÀº (do index-variable-specifications (end-test result) body) Àε¥, ¿©±â¼­ index-variable-specifications ´Â (step-variable initial-value step-value) ÇüÅÂÀÇ Ç׸ñµéÀÇ ¸®½ºÆ®ÀÌ°í, end-test ´Â ÀÓÀÇÀÇ ½Ä ±×¸®°í result ¿Í body ´Â Çϳª ÀÌ»óÀÇ ½ÄÀ¸·Î ÀÌ·ç¾îÁ® ÀÖ´Ù. Step value ¶Ç´Â step value ¿Í initial value ´Â »ý·«µÉ ¼ö ÀÖ´Ù. µÚÀÇ °æ¿ì¿¡´Â °ýÈ£ ¾È¿¡ index variable À» Æ÷ÇÔ½Ãų ÇÊ¿ä°¡ ¾ø´Ù. do ¸¦ óÀ½ ½ÇÇàÇÒ ¶§ ½ºÅܺ¯¼ö (step variable) ´Â ÃʱⰪ (initial value) ÀÌ µÇ°Å³ª, ÃʱⰪÀÌ ¾ø´Â °æ¿ì¿¡´Â nil ÀÌ µÈ´Ù. do ¿¡ ÀÇÇØ ¹Ýº¹µÇ´Â ·çÇÁ¿¡¼­ °¢ ½ºÅܺ¯¼ö´Â ±×°ÍÀÇ step value °¡ µÇ°Å³ª, step value °¡ ¾ø´Â °æ¿ì¿¡´Â º¯ÇÏÁö ¾Ê´Â´Ù. ½ºÅܺ¯¼öÀÇ °ªÁöÁ¤Àº º´·ÄÀûÀ¸·Î ¼öÇàµÈ´Ù. °¢°¢ÀÇ ·çÇÁ¿¡¼­ ½ºÅܺ¯¼öµéÀÌ ÁöÁ¤µÇ°í ³ª¼­, end test °¡ Æò°¡µÈ´Ù. ¸¸ÀÏ end test °¡ nil ÀÌ ¾Æ´Ñ °ªÀ» ¸®ÅÏÇϸé result ½ÄÀÌ ¼ø¼­ÀûÀ¸·Î Æò°¡µÇ°í ¸¶Áö¸· °ÍÀÇ °ªÀ» ¸®ÅÏÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸é body ¿¡ ÀÖ´Â ½ÄµéÀÌ ¼ø¼­ÀûÀ¸·Î Æò°¡µÈ´Ù. ´ÙÀ½¿¡ 9! À» °è»êÇÏ°í ºÎÀÛ¿ë (side effect) À¸·Î 1 ºÎÅÍ 9 ±îÁöÀÇ ¼ö¸¦ ÇÁ¸°Æ®ÇÏ´Â do ·çÇÁÀÇ °£´ÜÇÑ ¿¹°¡ ÀÖ´Ù.

´ÙÀ½¿¡ do ·çÇÁ°¡ ´ëÀÀ ÇÔ¼ö¸¦ Æ÷ÇÔÇÏ´Â ½ÄÀ» ¾î¶»°Ô ´ëÄ¡ÇÒ ¼ö ÀÖ´ÂÁö¸¦ ¼³¸íÇÏ´Â ¿¹°¡ ÀÖ´Ù.

ÀÌ¿Í °°ÀÌ Æ¯º°ÇÑ °æ¿ì¿¡´Â mapcar ½ÄÀÌ ÈξÀ °£°áÇÏÁö¸¸, do ·çÇÁ°¡ ´ëÀÀ ÇÔ¼öº¸´Ù ÈξÀ ÀûÀýÇÏ°Ô µµ¿òÀÌ µÇ´Â °æ¿ì°¡ ¸¹ÀÌ ÀÖ´Ù.

°£´ÜÇÑ ¹Ýº¹

do ÀÇ Æ¯º°ÇÑ °æ¿ì¿¡ ÇØ´çÇÏ´Â °ÍÀ¸·Î¼­ ÀÚÁÖ ¾²ÀÌ´Â Æí¸®ÇÑ ¹Ýº¹ ±¸Á¶µéÀÌ ÀÖ´Ù. Dolist ´Â ÀϹÝÀûÀ¸·Î (dolist (var expr result) body) ÀÇ ÇüÅ·Π»ç¿ëµÇ´Âµ¥, ¿©±â¼­ var ´Â expr À» Æò°¡ÇÔÀ¸·Î½á ¸¸µé¾îÁø ¸®½ºÆ®ÀÇ ¿ø¼Òµé·Î ¿¬¼ÓÀûÀ¸·Î ÁöÁ¤µÇ´Â ±âÈ£ÀÌ°í, body ´Â ¸®½ºÆ®ÀÇ °¢ ¿ø¼Ò¿¡ ´ëÇؼ­ Çѹø¾¿ Æò°¡µÇ°í, result ´Â body °¡ Æò°¡µÈ ÈÄ¿¡ dolist ÀÇ °ªÀ¸·Î Æò°¡µÇ¾î ¸®ÅϵǴ ¼±Åà »ç¾çÀÌ´Ù. ¸¸ÀÏ result °¡ ÁÖ¾îÁöÁö ¾ÊÀ¸¸é, dolist ´Â nil À» ¸®ÅÏÇÑ´Ù. expr Àº óÀ½À¸·Î ·çÇÁÀÇ body ¿¡ µé¾î°¡±â Àü¿¡ ¿ÀÁ÷ Çѹø¸¸ Æò°¡µÇ°í, expr ¿¡ ÀÖ´Â º¯¼öÀÇ °ªÀ» ¹Ù²Ù´Â °ÍÀÌ body °¡ Æò°¡µÇ´Â ȸ¼ö¸¦ º¯°æÇÏÁö ¾Ê´Â´Ù. ÀÌ·¯ÇÑ ¹æ¹ýÀ» »ç¿ëÇÏÁö ¾Ê´Â °ÍÀÌ ÁÁ´Ù. Dotimes ´Â ÀϹÝÀûÀ¸·Î (dotimes (var expr result) body) ÀÇ ÇüÅ·Π»ç¿ëµÇ´Âµ¥, ÀÌ °æ¿ì¿¡ var ´Â 0 ºÎÅÍ expr ÀÇ Æò°¡·ÎºÎÅÍ ³ª¿Â Á¤¼ö (ÀÌ°ÍÀº Æ÷ÇÔÇÏÁö ¾ÊÀ½) ¿¡ À̸£´Â Á¤¼öµé·Î ÁöÁ¤µÈ´Ù. body ¿¡ ÀÖ´Â var ÀÇ °ªÀ» º¯°æÇÏ´Â °ÍÀº À§ÇèÇÏ´Ù. ÀÌ¿Í °°Àº ¹Ýº¹ ±¸Á¶µéÀ» ¼³¸íÇÏ´Â ¿¹µéÀº ´ÙÀ½°ú °°´Ù.

´ÙÀ½ Àå¿¡¼­ ¿ì¸®´Â ´ëÀÀ ÇÔ¼ö, Àç±Í È£Ã⠱׸®°í ÀÌµé ¹Ýº¹ ±¸Á¶µéÀ» »ç¿ëÇÑ ´Ù¸¥ ½ºÅ¸ÀÏÀÇ ÇÁ·Î±×·¡¹Ö ¹æ¹ýÀ» ¼³¸íÇÒ °ÍÀÌ´Ù. Ã¥¿¡ ³ª¿Â ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ´Â ¹æ¹ýÀº ÇÑ °¡Áö ¹æ¹ý¸¸ ÀÖ´Â °ÍÀº ¾Æ´Ï´Ù. ÆíÇÏ°Ô ´À³¥ ¼ö ÀÖ´Â ÄÚµù ½ºÅ¸ÀÏÀ» ã´Â ¿¬½ÀÀ» ÇØ¾ß ÇÑ´Ù.

9. ÇÁ·Î±×·¥ÀÇ ¸ð´ÏÅ͸µ°ú µð¹ö±ë

´ëºÎºÐÀÇ °æ¿ì¿¡ À־ Lisp ÇÁ·Î±×·¥À» µð¹ö±ëÇÏ´Â °ÍÀº ´Ù¸¥ ¾ð¾îÀÇ ÇÁ·Î±×·¥À» µð¹ö±ëÇÏ´Â °Í°ú ´Ù¸£Áö ¾Ê´Ù. Äڵ尡 ±â´ëÇß´ø ´ë·Î ½ÇÇàµÇÁö ¾ÊÀ¸¸é ¿ì¼± ÇÔ¼ö À̸§ÀÇ Ã¶ÀÚ°¡ Ʋ¸®Áö ¾Ê¾Ò´Â°¡, °ýÈ£°¡ ¸ÂÁö ¾Ê¾Ò´Â°¡, ÇÔ¼ö¿¡ Àü´ÞµÇ´Â ÀμöÀÇ °³¼ö°¡ ¸ÂÁö ¾Ê¾Ò´Â°¡, ºÎÀû´çÇÑ Àμö ¶Ç´Â °ªÀ» ÁöÁ¤Çϱâ Àü¿¡ º¯¼ö¸¦ ÀÌ¿ëÇÏÁö ¾Ê¾Ò´Â°¡ µî °¡Àå ÈçÇÑ ¿À·ù¸¦ °Ë»çÇϸ鼭 µð¹ö±ëÀ» ½ÃÀÛÇ϶ó.

´ëºÎºÐÀÇ ÃÖ±Ù¿¡ ±¸ÇöµÈ Lisp µéÀº Á¤±³ÇÑ µð¹ö±ë µµ±¸¸¦ Á¦°øÇÏ°í ÀÖÀ¸³ª, ÀÌ·¯ÇÑ µµ±¸µé¿¡ ´ëÇÑ ³íÀÇ´Â ÀÌ Ã¥ÀÇ ¹üÀ§¸¦ ¹þ¾î³­´Ù. ±× ´ë½Å ¸ðµç Common Lisp ½Ã½ºÅÛ¿¡¼­ »ç¿ëÇÒ ¼ö ÀÖ°í, ÀÌ Ã¥¿¡ ÀÖ´Â ¿¬½À¹®Á¦¸¦ À§Çؼ­µµ ÃæºÐÈ÷ ¾µ ¼ö ÀÖ´Â °£´ÜÇÑ µð¹ö±ë µµ±¸¿Í ±â¼úµéÀ» »ìÆ캻´Ù.

Äڵ尡 ½ÇÇàµÇ°í ÀÖ´Â µ¿¾È¿¡ Á¤º¸¸¦ ÇÁ¸°Æ®Çϱâ À§Çؼ­ princ ³ª ÀÌ ÀýÀÇ ¸¶Áö¸· ºÎºÐ¿¡ ¼³¸íÇÒ format À̶ó´Â Á»´õ º¹ÀâÇÑ ÇÁ¸°Æ® ±â´ÉÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. °¡Àå °£´ÜÇÏ°Ô µð¹ö±ëÀ» µµ¿ï ¼ö ÀÖ´Â ¹æ¹ý ÁßÀÇ Çϳª´Â º¯¼öÀÇ °ªÀÇ º¯È­¸¦ ÃßÀûÇϱâ À§ÇØ Äڵ忡 ÀÓÀÇ·Î ÇÁ¸°Æ® ¹®À» ÷°¡ÇÏ´Â °ÍÀÌ´Ù.

ÇÁ·Î±×·¥ÀÇ ÃßÀû°ú ´Ü°èº° °Ë»ç

Common Lisp ÀÇ trace ±â´ÉÀ» »ç¿ëÇÏ¿© ¾ðÁ¦ ¾î¶² Àμö·Î ¾î¶°ÇÑ ÇÔ¼ö°¡ È£ÃâµÇ´ÂÁö¸¦ ÃßÀûÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½ÀÇ ¿¹´Â ÀÌ ÀåÀÇ ¾ÕºÎºÐ¿¡¼­ Á¤ÀÇµÈ µÎ °³ÀÇ ÇÔ¼ö¸¦ ¾î¶»°Ô ÃßÀûÇÏ´ÂÁö¸¦ ¼³¸íÇÏ°í ÀÖ´Ù.

untrace ¸¦ »ç¿ëÇÏ¿© ÇÔ¼ö¸¦ ÃßÀûÇÏ´Â °ÍÀ» ±×¸¸µÑ ¼ö ÀÖ´Ù.

°¡²û trace ´Â ÃæºÐÇÑ Á¤º¸¸¦ Á¦°øÇÏÁö ¾Ê°Å³ª, ¹Ý´ë·Î ¿ì¸®°¡ ¿øÇÏ´Â °Íº¸´Ù ³Ê¹« ¸¹Àº Á¤º¸¸¦ Á¦°øÇϱ⵵ ÇÑ´Ù. ±×·± °æ¿ì¿¡´Â ÇÑ ´Ü°è¸¸À» Á¶»çÇÏ´Â °ÍÀÌ À¯¿ëÇÒ °ÍÀÌ´Ù. step À̶ó´Â °ÍÀÌ ¹Ù·Î ±× ±â´ÉÀ» ÇÑ´Ù. trace ÀÇ »ó¼¼ÇÑ ºÎºÐ°ú ¸¶Âù°¡Áö·Î step ÀÇ »ó¼¼ÇÑ ºÎºÐÀº Common Lisp ÀÇ ½Ã½ºÅÛ¿¡ µû¶ó Á¦°¢±â ´Ù¸£´Ù. ´ÙÀ½ ¿¹´Â step À» »ç¿ëÇÏ¸é ¹«¾ùÀÌ À¯¿ëÇÑÁö¸¦ º¸¿©ÁÙ °ÍÀÌ´Ù.

ÀÌ ¿¹¿¡¼­ :h ¿Í :n ´Â ¡æ ÇÁ·ÒÇÁÆ®¿¡ ´ëÀÀÇؼ­ »ç¿ëÀÚ°¡ ÀÔ·ÂÇÑ °ÍÀÌ´Ù.

¿À·ù¾øÀÌ Æò°¡µÇ´Â ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ´Â °ÍÀº °ÅÀÇ ºÒ°¡´ÉÇÏ´Ù. ¿À·ù°¡ ÀϾ ¶§¸¶´Ù ÀÚµ¿ÀûÀ¸·Î µð¹ö°Å¿¡ µé¾î°¡¼­ ¾îÁö·¯¿î Á¤º¸µéÀÌ ³ªÅ¸³ª°í, °ð ¶Ç ÇϳªÀÇ ÇÁ·ÒÇÁÆ®°¡ ³ªÅ¸³ª°Ô µÉ °ÍÀÌ´Ù. º¸Åë ? ¶Ç´Â help ¶ó°í ÀÔ·ÂÇÏ¸é ¿À·ù·ÎºÎÅÍ °è¼Ó ÁøÇàÇØ ³ª¾Æ°¥ ¼ö ÀÖµµ·Ï ÇØÁÖ´Â ¸Þ´ºµéÀÇ ¸®½ºÆ®¸¦ º¸¿©Áְųª ¿À·ù¸¦ ÀÏÀ¸Å² ¿øÀο¡ ´ëÇÑ Á¤º¸¸¦ º¸¿©ÁÙ °ÍÀÌ´Ù.

¿À·ù¿Í µð¹ö±ëÀº ÇÁ·Î±×·¡¹Ö¿¡ ÀÖ¾î ÇÇÇÒ ¼ö ¾ø´Â °ÍÀÌ´Ù. »ç¿ëÇÏ°í ÀÖ´Â Common Lisp ÀÇ µð¹ö±ë µµ±¸¿¡ Ä£¼÷ÇØ Áöµµ·Ï ÃæºÐÇÑ ½Ã°£À» µéÀÌ´Â °ÍÀÌ ÁÁ´Ù.

¼­½Ä Ãâ·Â

¿ì¸®´Â ÀÌ¹Ì ÇÁ·Î±×·¥À¸·ÎºÎÅÍ ¼­½Ä Ãâ·Â (formatted output) À» »ý¼ºÇÏ´Â princ ¶ó´Â ÇÔ¼ö¸¦ º¸¾Ò´Ù. princ ¿Í ¼± º¹±Í (line feed) ¸¦ ¸¸µé¾î³»´Â terpri ¶ó´Â ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ´ëºÎºÐÀÇ ¿øÇÏ´Â Ãâ·ÂÀ» ´Ù·ê ¼ö ÀÖ´Ù. Common Lisp ¿¡¼­´Â ±×°Íµéº¸´Ù ¹ßÀüµÈ ¹æ¹ýµéÀÌ ÀÖÀ¸³ª, ±× Áß¿¡ Çϳª¸¸À» °£´ÜÈ÷ ¼³¸íÇÑ´Ù.

Format Àº º¹ÀâÇÑ ÇÁ¸°Æà ¶Ç´Â ¼­½Ä µµ±¸ÀÌ´Ù. (format destination string arguments) ÀÇ ÇüÅ°¡ format À» È£ÃâÇÏ´Â ÀϹÝÀûÀÎ ¹æ¹ýÀε¥, ¿©±â¼­ string Àº ÅDZâ´É (tabbing), ¼± º¹±Í ±×¸®°í ÀμöµéÀ» ÇÁ¸°Æ®ÇÏ´Â ¼­½Ä ¸í·ÉÀ» Æ÷ÇÔÇÑ´Ù. ¼­½Ä ¸í·ÉÀº Æ¿µå (tilde) ¹®ÀÚ (~) ·Î Ç¥½ÃµÇ°í ±× µÚ¿¡ Çϳª ÀÌ»óÀÇ ¹®ÀÚ°¡ ´õ ¿Â´Ù. ´ÙÀ½ ¿¹´Â format À» »ç¿ëÇÏ´Â ¸î °¡Áö ¹æ¹ýÀ» º¸¿©ÁÖ°í ÀÖ´Ù.

¼­½Ä ¸í·É ~4,2F ´Â Á¤ÇØÁø ¼­½ÄÀ» ÇÁ¸°Æ®ÇÒ ¶§ »ç¿ëµÇ´Âµ¥, ¿©±â¼­´Â ¼Ò¼öÁ¡À» Æ÷ÇÔÇÏ¿© ÃÖ¼Ò ³× °³ÀÇ ÀÚ¸®¼ö·Î ½Ç¼ö¸¦ Ç¥ÇöÇÏ°í, ¼Ò¼öÁ¡ ÀÌÇÏ´Â µÎ ÀÚ¸®·Î Ç¥ÇöÇ϶ó´Â °ÍÀ» Áö½ÃÇÑ´Ù. ¼­½Ä ¸í·É ~A ´Â princ ·Î ÇÁ¸°Æ®ÇÏ´Â °Í°ú ¸¶Âù°¡Áö·Î ÀÓÀÇÀÇ °´Ã¼¸¦ ÇÁ¸°Æ®ÇÏ´Â µ¥¿¡ »ç¿ëµÈ´Ù. ¸¸ÀÏ destination ÀÌ nil À̸é format Àº ¼­½ÄÈ­µÈ ¹®ÀÚ¿­À» ¸®ÅÏÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸é, format ´Â nil À» ¸®ÅÏÇϸ鼭 ¹®ÀÚ¿­À» ÁöÁ¤µÈ destination À¸·Î º¸³½´Ù. ¸¸ÀÏ destination ÀÌ t À̸é format Àº ÀϹÝÀûÀ¸·Î Lisp Çؼ®±â°¡ »ç¿ëÇÏ°í ÀÖ´Â Å͹̳ÎÀ̳ª È­¸éÀÎ ±âº» Ãâ·Â (standard output) À¸·Î ÇÁ¸°Æ®ÇÑ´Ù.

Common Lisp ´Â ¿À·ù¿¡ ´ëóÇϰųª Çؼ®±â¿Í ´ëÈ­Çϱâ À§ÇÑ ´Ù¾çÇÑ ÇÁ¸°Æ® ·çƾÀ» Á¦°øÇÑ´Ù. Lisp Çؼ®±â¸¦ ´Ù·ç¸é¼­ À¯¿ëÇÏ´Ù°í »ý°¢µÇ´Â °Í Çϳª¸¦ ¼Ò°³ÇÏ°Ú´Ù. (setq *print-pretty* t) ¶ó°í ½ÇÇàÇÏ¸é ¸¹ÀÌ ÁßøµÈ ¸®½ºÆ® ±¸Á¶¸¦ ÈξÀ Àб⠽±µµ·Ï º¸ÀÌ°Ô ÇÒ ¼ö ÀÖ´Ù.

10. ±ÔÄ¢±â¹Ý ¹ÝÀÀ ½Ã½ºÅÛÀÇ Àç¹æ¹®

ÀÌ ÀåÀÇ Ã³À½ ºÎºÐ¿¡¼­ ¹è´Þ ·Îº¿ÀÇ ÇൿÀ» Á¦¾îÇÏ´Â ±ÔÄ¢µéÀ» »ç¿ëÇÏ´Â ÀÀ¿ë ¿¹¸¦ ¼³¸íÇß´Ù. °¨°¢±â±â¿Í °¨°¢±â±âÀÇ °ªµéÀ» Ç¥ÇöÇÏ°í Á¦¾î ¸Å°³º¯¼ö¿Í ±×°ÍµéÀÇ °¡´ÉÇÑ °ªÀ» Ç¥ÇöÇϱâ À§ÇÑ ±âÈ£¸¦ µµÀÔÇÏ¿´´Ù. ÀÌÁ¦ ·Îº¿À» Á¦¾îÇϱâ À§ÇØ »ç¿ëµÇ´Â ÇÊ¿äÇÑ ±ÔÄ¢°ú ÇÁ·Î½ÃÀú¸¦ ¹¦»çÇϱâ À§ÇÑ ÇÊ¿äÇÑ Áغñ¸¦ ¸ðµÎ °®Ãß¾ú´Ù. ¿ì¼±, °¨°¢±â±âÀÇ °ª°ú Á¦¾î ¸Å°³º¯¼öÀÇ °ª¿¡ ´ëÇÑ ¸®Æ÷Æ®¸¦ À§ÇÑ ÀÚ·á Ãß»óÈ­·ÎºÎÅÍ ¾Ë¾Æº¸ÀÚ.

¿¹¸¦ µé¾î, (forward near) ´Â forward °¨°¢±â±â°¡ near ÀÇ °ªÀ» °¡Áö°í ÀÖ´Ù´Â ¸®Æ÷Æ®¿¡ ÇØ´çÇÑ´Ù.

°°Àº °¨°¢±â±â´Â ´Ù¸¥ ½Ã°£¿¡ ´Ù¸¥ º¸°í¸¦ ÇÒ °ÍÀÌ´Ù. ¸®Æ÷Æ®ÀÇ ½Ã°£¿¡ ´ëÇÑ »çÇ×À» °è¼Ó À¯ÁöÇϱâ À§Çؼ­, ¿ì¸®´Â °¢ ¸®Æ÷Æ®°¡ ¹ß»ýÇÑ ½Ã°£¿¡ ÇØ´çÇÏ´Â Á¤¼ö¸¦ ¿¬°ü½ÃŲ´Ù. ´ÙÀ½ÀÇ ÀÚ·á Ãß»óÈ­´Â °¨°¢±â±â¿Í ¸Å°³º¯¼ö ¸®Æ÷Æ®¿¡ »ç¿ëµÈ´Ù.

¿¹¸¦ µé¾î, ((forward far) 1012) ´Â forward °¨°¢±â±â°¡ ½Ã°£ 1012 ¿¡ far ¸¦ º¸°íÇÑ °ÍÀ» ³ªÅ¸³½´Ù. °è¼ÓµÇ´Â ¼³¸í¿¡¼­ ÀڷḦ »ý¼ºÇس»´Â Á¦¾î ½Ã½ºÅÛ¿¡ °üÇÑ ºÎºÐ¿¡ °üÇؼ­´Â ¾ð±ÞÇÏÁö ¾ÊÀ» °ÍÀ̹ǷΠmake-REPORT ¿Í make-TUPLE ´Â »ç¿ëÇÏÁö ¾Ê°Ú´Ù.

Á¦¾î ¾Ë°í¸®ÁòÀº °¨°¢±â±â¿Í Á¦¾î ¸Å°³º¯¼öÀÇ °¡Àå ÃÖ±ÙÀÇ ¸®Æ÷Æ®·Î ÀÌ·ç¾îÁø ¸®½ºÆ®¸¦ »ç¿ëÇÑ´Ù. ¿ì¼± óÀ½À¸·Î °í·ÁÇÒ update ¶ó´Â ·çƾÀº »õ·Î¿î ¸®Æ÷Æ®ÀÇ ¸®½ºÆ®¿Í ÀÌÀüÀÇ ¸®Æ÷Æ®ÀÇ ¸®½ºÆ®¸¦ Àμö·Î ÃëÇÏ°í ±×°ÍµéÀ» °áÇÕÇÑ´Ù. ÀÌÀüÀÇ ¸®½ºÆ®´Â ¸ðµç °¨°¢±â±âµé°ú Á¦¾î ¸Å°³º¯¼öµé·ÎºÎÅÍÀÇ ¸®Æ÷Æ®¸¦ Æ÷ÇÔÇÏ°í ÀÖÁö¸¸, »õ·Î¿î ¸®½ºÆ®´Â ±×·¸Áö ¾Ê´Ù. ¸®Æ÷Æ®¸¦ °áÇÕÇÏ´Â ¹æ¹ýÀº °¢°¢ÀÇ ÀÌÀü ¸®Æ÷Æ®¸¦ °í·ÁÇÏ¿© »õ·Î¿î ¸®Æ÷Æ®¿¡¼­ °»½ÅÀÌ µÇ¾ú´Â°¡¸¦ Á¶»çÇÏ´Â °ÍÀÌ´Ù.

Common Lisp ÀÇ assoc ÇÔ¼ö´Â ÇϳªÀÇ ½Ä°ú nil ÀÌ ¾Æ´Ñ ¸®½ºÆ®·Î ÀÌ·ç¾îÁø µÎ °³ÀÇ Àμö¸¦ ÃëÇÑ´Ù. µÎ¹ø° Àμö´Â °áÇÕ ¸®½ºÆ® (association list) ¶ó°í ºÒ¸®¿ì´Âµ¥, ±âÈ£½Ä °£¿¡ ´ëÀÀÀÌ °¡´ÉÇϵµ·Ï ÇØÁØ´Ù (¿¹¸¦ µé¾î, ((type truck) (color red) (year 1950))). °£´ÜÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖ´Â °ÍÀ¸·Î assoc Àº ÇϳªÀÇ ±âÈ£¿Í ±âÈ£ ½ÖµéÀÇ ¸®½ºÆ®¸¦ Àμö·Î ÃëÇؼ­ first ¿¡ ÇØ´çÇÏ´Â ¿ø¼Ò°¡ ù¹ø° Àμö¿Í eq ÀÎ ½ÖÀÌ ÀÖÀ¸¸é ±× ù¹ø° ½ÖÀ» ¸®ÅÏÇÏ°í, ±×·¯ÇÑ ½ÖÀÌ ¾øÀ¸¸é nil À» ¸®ÅÏÇÏ´Â °ÍÀÌ´Ù. ¿¹¸¦ µé¾î, (assoc 'left '((left far) (right near))) Àº (left far) ¸¦ ¸®ÅÏÇÑ´Ù.

Assoc Àº Å°¿öµå¿¡ ÀÇÇØ ÁöÁ¤µÈ ¼±Åà Àμö¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ½Ã°£ µµÀåÀÌ ÂïÈù ¸®Æ÷Æ®ÀÇ ¸®½ºÆ®´Â ((left far) 1) ÇüÅ·ΠµÇ¾î ÀÖ´Â °ÍÀ» À¯ÀÇÇ϶ó.

°»½ÅµÈ ¸®Æ÷Æ®¸¦ ã±â À§Çؼ­ °°Àº ¸Å°³º¯¼ö¿¡ ´ëÇØ ´Ù¸¥ °ªÀ» °¡Áø »õ·Î¿î ¸®Æ÷Æ®¸¦ ã´Â´Ù.

¶Ç ´Ù¸¥ ¼±Åà Ű¿öµå Àμö¸¦ »ç¿ëÇÏ¿© ¿¬»ó ¸®½ºÆ®¿¡ ÀÖ´Â ½ÖµéÀÇ Ã¹¹ø° ¿ø¼Ò¸¦ °¡¸®Å°µµ·Ï ÇÏ¿© °°Àº °á°ú¸¦ ¾òÀ» ¼ö ÀÖ´Ù.

°áÇÕ ¸®½ºÆ®¿¡ ÀÖ´Â °¢ ½ÖÀÇ Ã¹¹ø° ¿ø¼Ò¿¡ ´ëÇؼ­ assoc ÀÇ Ã¹¹ø° Àμö¸¦ Å×½ºÆ®ÇÏ´Â ´ë½Å¿¡ :key ¿¡ ÀÇÇؼ­ µµÀԵǴ ÇÔ¼ö¸¦ °áÇÕ ¸®½ºÆ®¿¡ ÀÖ´Â °¢ ½ÖÀÇ ¿ø¼Ò¿¡ ´ëÇؼ­ Àû¿ëÇÑ °á°ú¿¡ ´ëÇØ Ã¹¹ø° Àμö¸¦ Å×½ºÆ®ÇÑ´Ù.

´ë´ÜÄ¡ ¾ÊÀº ¹®Á¦°¡ Çϳª ÀÖ´Ù. assoc ¿¡ ´ëÇؼ­ ¾ð±ÞÇÒ ¶§ Æ©Çà (tuple) ÀÌ µÎ °³ÀÇ ¿ø¼Ò¸¦ °¡Áø ¸®½ºÆ®·Î¼­ ±¸ÇöµÇ¾î ÀÖ°í, ¸®Æ÷Æ®´Â ÇÑ Æ©Çðú ÇϳªÀÇ Á¤¼ö·Î ÀÌ·ç¾îÁø ¸®½ºÆ®·Î¼­ ±¸ÇöµÇ¾î ÀÖ´Ù°í °¡Á¤Çß´Ù. ÀÌ°ÍÀº ±¦ÂúÀº ¹æ¹ýÀÌÁö¸¸ ÀÚ·á Ãß»óÈ­¸¦ ÀÌ¿ëÇÏ´Â Áß¿äÇÑ ÀÌÁ¡Àº ±×°ÍÀÌ ¾î¶»°Ô ±¸ÇöµÇ¾î ÀÖ´ÂÁö¿¡ ´ëÇÏ¿© »ý°¢ÇÒ ÇÊ¿ä°¡ ¾øµµ·Ï ÇÏ´Â °ÍÀ̾ú´Ù. ¾Õ¿¡¼­ Çß´ø °Íó·³ assoc À» »ç¿ëÇÔÀ¸·Î½á ±¸ÇöÇÏ´Â µ¥ ÀåÁ¡ÀÌ ÀÖ¾úÁö¸¸ °á°úÀûÀ¸·Î´Â ÀÚ·á Ãß»óÈ­¸¦ À§¹ÝÇÑ´Ù. ¸¸ÀÏ ¾î¶² »ç¶÷ÀÌ ±× ±¸ÇöÀ» º¯°æÇÏ·Á ÇÑ´Ù¸é ¿¹¸¦ µé¾î ¸®½ºÆ® ´ë½Å¿¡ ¹è¿­ (array) À» »ç¿ëÇÑ´ÙµçÁö, ¸¶Áö¸·ÀÇ ½Ã°£ µµÀå ´ë½Å¿¡ óÀ½ °Í¿¡ ½Ã°£ µµÀåÀ» Âï´Â´ÙµçÁö Çϸé, assoc ÀÌ »ç¿ëµÈ ¸ðµç À§Ä¡¸¦ ã¾Æ³»¾î¼­ »õ·Î¿î ±¸Çö¿¡ ¸Âµµ·Ï ¹Ù²Ù¾î¾ß¸¸ ÇÑ´Ù.

¸®Æ÷Æ®°¡ ¹Ýµå½Ã ¸®½ºÆ®·Î ±¸ÇöµÇ¾î ÀÖ´Ù°í °¡Á¤ÇÒ ¼ö ¾ø±â ¶§¹®¿¡ assoc ¸¦ »ç¿ëÇÒ ¼ö ¾ø´Ù. ±×·¯³ª, assoc ¿¡ ´ëÇؼ­ ¹è¿î °ÍÀº ÇêµÈ °ÍÀÌ ¾Æ´Ï´Ù. ¿ì¸®´Â assoc À» ´ÙÀ½ Àå¿¡¼­ Ä£¼÷ÇÏ°Ô »ç¿ëÇÒ °ÍÀÌ´Ù. assoc ´ë½Å¿¡ find ¶ó´Â º¸´Ù ÀϹÝÀûÀÎ ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. Find ´Â ÀÓÀÇÀÇ Lisp °´Ã¼¿Í ÇϳªÀÇ ¸®½ºÆ®¸¦ Àμö·Î ÃëÇÏ°í, ¸®½ºÆ®»ó¿¡¼­ ±× °´Ã¼¿Í eq ÀΠù¹ø° ¿ø¼Ò¸¦ ¸®ÅÏÇϰųª, ±×·± ¿ø¼Ò°¡ ¾ø´Â °æ¿ì¿¡´Â nil À» ¸®ÅÏÇÑ´Ù. ¼±Åà »çÇ×ÀÎ :key ÇÔ¼ö´Â assoc ¿¡¼­¿Í °°ÀÌ ¿ø¼ÒÀÇ first ¿¡ Àû¿ëµÇ´Â °ÍÀÌ ¾Æ´Ï¶ó ¸®½ºÆ®ÀÇ ¿ø¼Ò¿¡ Àû¿ëµÈ´Ù. ¿¹¸¦ µé¾î (assoc item list) ´Â (find item list :key #'first) ¿Í °°´Ù.

find ¸¦ »ç¿ëÇÏ¿© ÀÚ·á Ãß»óÈ­¸¦ À¯ÁöÇϸ鼭 ¸®Æ÷Æ®ÀÇ ¸®½ºÆ®¿¡ ´ëÇÑ ¿¬°ü°è»êÀ» ¼öÇàÇÏ´Â µÎ °³ÀÇ ÇÔ¼ö¸¦ Á¤ÀÇÇغ¸ÀÚ. ù¹ø° ÇÔ¼ö´Â ƯÁ¤ ¸Å°³º¯¼ö¸¦ Æ©Ç÷Π¸®Æ÷Æ®¸¦ ã´Â °ÍÀÌ°í, µÎ¹ø° ÇÔ¼ö´Â Æ©Ç÷Π¸®½ºÆ®¸¦ ã´Â´Ù.¤¿

ÀÌÁ¦, update ¿¡ ´ëÇÑ ¾Ë°í¸®ÁòÀ» ´ÙÀ½°ú °°ÀÌ ¼­¼úÇÒ ¼ö ÀÖ´Ù. ¿ì¸®´Â ½Ã°£ µµÀåÀÌ ÂïÈù ¸®Æ÷Æ®ÀÇ µÎ ¸®½ºÆ®·Î update ¸¦ È£ÃâÇÑ´Ù. ÀÌÀü ¸®Æ÷Æ®µéÀÇ ¸®½ºÆ®¿¡ ÀÖ´Â °¢ ½Ã°£ µµÀå ÂïÈù ¸®Æ÷Æ®¿¡ ´ëÇÏ¿© °°Àº ¸Å°³º¯¼ö¸¦ °¡Áø »õ·Î¿î ¸®Æ÷Æ®°¡ Àִ°¡¸¦ »ìÆ캻´Ù. ¸¸ÀÏ ±×·¸´Ù¸é, ¸®Æ÷Æ®ÀÇ ¸®½ºÆ®¿¡ »õ·Î¿î ¸®Æ÷Æ®¸¦ ÷°¡ÇÏ°í update ¿¡ ÀÇÇؼ­ ¸®ÅÏÀÌ µÇµµ·Ï ÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸é ÀÌÀü ¸®Æ÷Æ®¸¦ ¸®Æ÷Æ®ÀÇ ¸®½ºÆ®¿¡ ÷°¡ÇÏ°í ¸®ÅÏÇÑ´Ù. ÀÌ ¾Ë°í¸®ÁòÀº Lisp À¸·Î ´ÙÀ½°ú °°ÀÌ ±¸ÇöµÈ´Ù.

(or first second) ÀÇ Çü½ÄÀº (let ((result first)) (if (null result) second result)) ¸¦ °è»êÇÏ°í ÀÖ´Ù.

update ¸¦ ±¸ÇöÇÏ´Â ¶Ç ´Ù¸¥ ¹æ¹ýÀ» »ý°¢ÇØ º¸ÀÚ. ÀÌ °æ¿ì¿¡¼­´Â ÀÌÀü °ÍÀ̳ª »õ·Î¿î ¸®Æ÷Æ® ¸ðµÎ °¨°¢±â±â¿Í Á¦¾î ¸Å°³º¯¼ö¿¡ ´ëÇÑ ¸®Æ÷Æ®¸¦ ¹Ýµå½Ã Æ÷ÇÔÇÒ ÇÊ¿ä°¡ ¾ø°í °°Àº ¸Å°³º¯¼öÀÇ ¿©·¯ ½Ã°£¿¡¼­ÀÇ ¸®Æ÷Æ®µéÀ» Æ÷ÇÔÇÒ ¼ö ÀÖ´Ù°í °¡Á¤Çغ¸ÀÚ. ´ÙÀ½ÀÇ ±¸Çö¿¡¼­ dolist ÀÇ ¹Ýº¹ ±¸Á¶¿Í ¸®Æ÷Æ®¸¦ Àμö·Î ÇÏ°í ±×°ÍÀ» ÀÌÀü ¸®Æ÷Æ®¿Í °áÇÕÇÏ´Â fuse ¶ó´Â ¼­ºê·çƾÀ» »ç¿ëÇÑ´Ù. ÀÌÀü ¾Ë°í¸®Áò¿¡¼­¿Í °°ÀÌ ½Ã°£ µµÀåÀÌ ÂïÈù ¸®Æ÷Æ®µéÀÇ µÎ ¸®½ºÆ®·Î update ¸¦ È£ÃâÇÑ´Ù. ±×·¯³ª ÀÌ °æ¿ì¿¡´Â fuse ¼­ºê·çƾÀ» »ç¿ëÇÏ¿© ÀÌÀüÀÇ ¸®Æ÷Æ®ÀÇ ¸®½ºÆ®¸¦ °»½ÅÇϸ鼭 »õ·Î¿î ¸®Æ÷Æ®µéÀ» Çѹø¿¡ Çϳª¾¿ ´Ü°èÀûÀ¸·Î ó¸®ÇÑ´Ù.

Fuse ´Â ÇϳªÀÇ ¸®Æ÷Æ®¿Í ¸®Æ÷Æ®µéÀÇ ¸®½ºÆ®¸¦ Àμö·Î ÃëÇÑ´Ù. ¸¸ÀÏ Ã¹¹ø° Àμöº¸´Ù ºü¸¥ ½Ã°£ µµÀåÀ» °¡Áö¸ç °°Àº ¸Å°³º¯¼ö¿¡ ´ëÇØ º¸°íÇÏ´Â ¸®Æ÷Æ®°¡ ¸®½ºÆ®¿¡ ÀÖÀ¸¸é óÀ½ ³ª¿À´Â ±× ¸®Æ÷Æ®¸¦ ù¹ø° Àμö·Î ġȯÇÏ°í, ±×·± ¸®Æ÷Æ®°¡ ¾øÀ¸¸é ¸®Æ÷Æ® ¸®½ºÆ®ÀÇ ¸¶Áö¸·¿¡ ù¹øÀç Àμö¸¦ ÷°¡ÇÑ´Ù. Fuse ´Â Àç±Í È£ÃâÀ» »ç¿ëÇÏ¿© first ¿Í rest ·Î ÀÌÀü ¸®Æ÷Æ® ¸®½ºÆ®¸¦ ºÐ¸®ÇÏ°í, cons ·Î ´Ù½Ã ÇÕÄ£´Ù. °°Àº ¸Å°³º¯¼ö¸¦ °¡Áø ÀÌÀü ¸®Æ÷Æ® ´ë½Å¿¡ »õ·Î¿î ¸®Æ÷Æ®¸¦ ġȯÇϰųª ¶Ç´Â ±×·¯ÇÑ ÀÌÀü ¸®Æ÷Æ®°¡ ¾øÀ¸¸é ÀÌÀü ¸®Æ÷Æ®µéÀÇ ³¡¿¡ »õ·Î¿î ¸®Æ÷Æ®¸¦ µ¡ºÙÀδÙ.

´ÙÀ½Àº update °¡ ¾î¶»°Ô µ¿ÀÛÇÏ´ÂÁö¸¦ º¸¿©ÁÖ´Â ¿¹ÀÌ´Ù.

´ÙÀ½¿¡ fuse ÀÇ ¶Ç ´Ù¸¥ ±¸Çö¹æ¹ýÀ¸·Î param-assoc ¿Í Common Lisp ¿¡¼­ Á¦°øÇÏ´Â remove ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀÌ ÀÖ´Ù. Remove ´Â ÇϳªÀÇ ½Ä°ú ¸®½ºÆ®¸¦ Àμö·Î ÃëÇÏ¸ç ±× °á°ú´Â ½Ä°ú eq ÀÎ ¿ø¼Ò¸¸À» ³ª¸ÓÁö ¿ø¼Òµé·Î ÀÌ·ç¾îÁø »õ·Î¿î ¸®½ºÆ®°¡ µÈ´Ù. ¿¹¸¦ µé¾î, (remove 1 '(1 2 3 1)) Àº (2 3) À» ¸®ÅÏÇÑ´Ù. Remove ´Â ¼±ÅÃÀûÀÎ Å°¿öµå Àμö¸¦ °¡Áø´Ù. ¿¹¸¦ µé¾î, (remove '(1 2) '(a (1 2) b c) :test #'equal) Àº (a b c) ¸¦ ¸®ÅÏÇÑ´Ù.

(cons report (remove a old)) ´ë½Å¿¡ (substitute report a old) ·Î ¹Ù²Ù¾î ¾µ ¼öµµ ÀÖ´Ù. Substitute ´Â ¼¼¹ø° Àμö¿¡ ÇØ´çÇÏ´Â ¸®½ºÆ®ÀÇ ¿ø¼Òµé Áß¿¡ ¼¼¹ø° Àμö·Î ³ªÅ¸³ª´Â ¸ðµç ¿ø¼ÒµéÀ» ù¹ø° Àμö·Î ġȯÇÏ´Â °ÍÀÌ´Ù. Subst ´Â ÁßøµÈ ¸®½ºÆ® ±¸Á¶¿¡¼­ ġȯÀ» ÇàÇÑ´Ù. ¿¹¸¦ µé¾î, (substitute 1 0 '(0 1 (1 0))) Àº (1 1 (1 0)) À» ¸®ÅÏÇÏ´Â µ¥¿¡ ¹ÝÇؼ­ (subst 1 0 '(0 1 (1 0))) Àº (1 1 (1 1))) À» ¸®ÅÏÇÑ´Ù.

ÀÌ Ã¥¿¡¼­ ¼­¼úÇÑ ´ëºÎºÐÀÇ Common Lisp ÇÔ¼ö´Â ¾ð±ÞÇß´ø °Íº¸´Ù ÈξÀ À¶Å뼺ÀÌ ÀÖ´Ù. Áï, ¸¹Àº ÇÔ¼öµéÀº ¼³¸íÇÑ °Íº¸´Ù Å°¿öµå¸¦ ´õ ¸¹ÀÌ °¡Áö°í ÀÖ´Ù. °Ô´Ù°¡ ¸®½ºÆ®¿¡ Àû¿ëÇÒ ¼ö ÀÖ´Â ÇÔ¼ö Áß ´ëºÎºÐÀº ¸®½ºÆ®¿Í ÀÏÂ÷¿ø ¹è¿­À» Æ÷ÇÔÇÏ´Â º¸´Ù ÀϹÝÀûÀÎ ¼øÂ÷ÀûÀÎ ÀÚ·á¿¡µµ Àû¿ëÇÒ ¼ö ÀÖ´Ù.

ÀÌÁ¦, °¨°¢±â±â ¸®Æ÷Æ®¸¦ °»½ÅÇÒ ¼ö ÀÖ°Ô µÇ¾úÀ¸´Ï ¾î¶°ÇÑ ÇàÀ§¸¦ ÃëÇØ¾ß Çϴ°¡¸¦ °áÁ¤ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. ±× Á¦¾î Àü·«Àº ±ÔÄ¢ÀÇ ÁýÇÕÀ¸·Î ÄÚµåÈ­µÇ¾î ÀÖ´Ù. ¿ì¸®´Â ±ÔÄ¢À» À§ÇØ ´ÙÀ½°ú °°Àº ÀÚ·á Ãß»óÈ­¸¦ »ç¿ëÇÑ´Ù.

Á¶°Ç (condition) Àº °¨°¢±â±â/°ª½Ö¿¡ ÇØ´çÇÏ°í, ÇàÀ§ (action) ´Â Á¦¾î ¸Å°³º¯¼ö/°ªÀÇ ½Ö¿¡ ÇØ´çÇÑ´Ù. ±ÔÄ¢ÀÇ °¢ Á¶°ÇÀÌ ¸®Æ÷Æ®¿Í equal ÀÇ °ü°è·Î ¿¬°üµÇ¾î ÀÖÀ¸¸é ±× ±ÔÄ¢Àº ÁÖ¾îÁø ¸®Æ÷Æ®µéÀÇ ÁýÇÕ¿¡ ´ëÇؼ­ Àû¿ë°¡´ÉÇÏ´Ù¶ó°í ÇÑ´Ù. ´ÙÀ½ ÇÔ¼ö´Â ±ÔÄ¢ÀÌ Àû¿ë°¡´ÉÇÑ°¡¸¦ °áÁ¤ÇÏ´Â ¼ú¾î¸¦ ±¸ÇöÇÑ °ÍÀÌ´Ù.

Applicablep ´Â ±ÔÄ¢°ú ½Ã°£ µµÀåÀÌ ÂïÈù ¸®Æ÷Æ®µéÀÇ ¸®½ºÆ®¸¦ Àμö·Î ÃëÇÏ°í, ±× ±ÔÄ¢ÀÇ Á¶°Ç ¸®½ºÆ®¿¡ ÀÖ´Â °¢ Á¶°ÇÀÌ ¸®Æ÷Æ® ¸®½ºÆ®¿¡ ÀÖ´Â ÇÑ ¸®Æ÷Æ®¿¡ ÇØ´çÇϴ°¡¸¦ Àç±Í È£ÃâÀ» »ç¿ëÇÏ¿© °Ë»çÇÑ´Ù. º¸Á¶ ÇÔ¼ö´Â Àç±Í È£Ãâ¿¡ µé¾î°¡´Â tuples ¶ó´Â º¯¼ö¸¦ µµÀÔÇÏ¿© Àç±Í È£ÃâÀ» ¿Ï¼ºÇÑ´Ù. ÀÌ¿Í °°Àº º¸Á¶ ÇÔ¼ö´Â Àç±ÍÀûÀÎ ÇÁ·Î½ÃÀú¸¦ ±¸ÇöÇÏ´Â µ¥¿¡ ¸¹ÀÌ ¾²ÀδÙ.

¿ì¸®´Â ¶ÇÇÑ ºÎ¿ïÇÔ¼ö¿Í °°ÀÌ µ¿ÀÛÇϴ Ưº°ÇÑ ´ëÀÀ ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© applicablep ¸¦ ±¸ÇöÇÒ ¼ö ÀÖ´Ù. (every test arguments) ¶ó´Â ½ÄÀº test °¡ arguments ÀÇ °¢°¢ÀÇ ¿ø¼Ò¿¡ ³¢¸®³¢¸® Àû¿ëµÉ ¶§¿¡ ¸ðµÎ nil ÀÌ ¾Æ´Ï¸é t ¸¦ ¸®ÅÏÇÑ´Ù. ¿¹¸¦ µé¾î (every #'oddp '(3 5 9)) ¿Í (every #'eq '(a 1) '(a 1)) Àº ¸ðµÎ t ¸¦ ¸®ÅÏÇÑ´Ù.

´ÙÀ½ ÇÔ¼ö´Â ±ÔÄ¢ ÁýÇÕ¿¡ ÀÖ´Â ¸ðµç ±ÔÄ¢À» Å×½ºÆ®ÇÏ°í, ±× Áß Àû¿ë°¡´ÉÇÑ ±ÔÄ¢¿¡ µû¶ó ½ÇÇàÇÑ´Ù.

¿ì¸®°¡ °£´ÜÇÏ°Ô ±¸ÇöÇÑ °Í¿¡¼­ ½ÇÁ¦·Î ÀÌ·ç¾îÁö´Â °ÍÀº ´ÜÁö ±ÔÄ¢ÀÇ ÇàÀ§¿¡ ½Ã°£ µµÀåÀ» Ãß°¡ÇÏ´Â °Í»ÓÀÌ´Ù. Common Lisp ÇÔ¼öÀÎ get-intermal-real-time Àº ÇöÀçÀÇ ½Ã°£À» Ç¥ÇöÇÏ´Â Á¤¼ö°ªÀ» ¸®ÅÏÇÑ´Ù.

(defun act (action) (list action (get-internal-real-time)

¿©±â¿¡ react ÀÇ °á°ú¸¦ º¸¿©ÁÖ´Â °£´ÜÇÑ ¿¹°¡ ÀÖ´Ù.

¸¸ÀÏ, ¼­·Î ¾î±ß³ª´Â µÎ °³ ÀÌ»óÀÇ Àû¿ë°¡´ÉÇÑ ±ÔÄ¢ÀÌ ÀÖ´Â °æ¿ì¿¡´Â ÇÔ¼ö´Â °¢ ÇàÀ§¿¡ act ¸¦ ¸ðµÎ Àû¿ëÇÒ °ÍÀÌ´Ù. º¸´Ù Çö½ÇÀûÀÎ ±¸Çö¿¡¼­´Â Àû¿ë°¡´ÉÇÑ ±ÔÄ¢ÀÇ Ãæµ¹À» ÇØ°áÇÏ´Â ¹æ¹ýµéÀ» Á¦°øÇØ¾ß ÇÒ °ÍÀÌ´Ù.

´Ù¸¥ À¯¿ëÇÑ ´ëÀÀÇÔ¼ö¸¦ »ç¿ëÇÏ¿© react ¸¦ ±¸ÇöÇÏ´Â ¹æ¹ýÀ» ¾Ë¾Æº¸ÀÚ. Mapcan Àº nconc ¸¦ »ç¿ëÇÏ¿© °á°ú¸¦ °áÇÕÇÑ´Ù´Â Á¡À» Á¦¿ÜÇϸé mapcar ¿Í °ÅÀÇ ºñ½ÁÇÑ ±â´ÉÀ» ÇÑ´Ù. ¿¹¸¦ µé¾î (mapcan #'rest '((0) (1 a) (2) (3 b) (4 c))) ¿Í (apply #'nconc (mapcar #'rest '((0) (1 a) (2) (3 b) (4 c))))) ´Â ¸ðµÎ (a b c) ¸¦ ¸®ÅÏÇÑ´Ù.

run À̶ó´Â ÇÔ¼ö´Â Lisp ÀÇ ¹Ýº¹ ±¸Á¶ÀÎ dotimes ¸¦ »ç¿ëÇÏ¿© react ¿Í update ¸¦ ÇÑ »çÀÌŬ¿¡¼­ Àû¿ëÇÑ´Ù. collect °¡ °¡Àå ÃÖ±ÙÀÇ °¨°¢±â±â ¸®Æ÷Æ®¸¦ ¸®ÅÏÇÑ´Ù°í °¡Á¤ÇÏÀÚ.

ÀÌ ÇÔ¼ö´Â 0 ºÎÅÍ 99 ±îÁöÀÇ index °ªÀ¸·Î 100 ¹øÀÇ »çÀÌŬÀ» ¼öÇàÇÑ´Ù. ¶Ç ´Ù¸¥ ¹æ¹ýÀ¸·Î »óÈ£°£¿¡ È£ÃâÇÏ´Â Àç±ÍÇÔ¼ö¸¦ »ç¿ëÇÏ¿© run À» ±¸ÇöÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

¼³¸íÇÑ ¹Ù¿Í °°ÀÌ, Common Lisp Àº ¾Ë°í¸®ÁòÀ» ±¸ÇöÇÏ´Â µ¥¿¡ ÀÖ¾î ¸Å¿ì ´Ù¾çÇÑ ¹æ¹ýµéÀ» °¡´ÉÇÏ°Ô ÇØÁØ´Ù. ´ÙÀ½ ÀåºÎÅÍ´Â °¡Àå °£´ÜÇϰųª ȤÀº ¸Å¿ì °£°áÇÑ ±¸Çö¹æ¹ýÀ» ¼±ÅÃÇÏ¿© ¼³¸íÇÒ °ÍÀÌ´Ù.

¿ä¾à

ÀÌ Àå¿¡¼­´Â Lisp ·Î ±âÈ£ ÇÁ·Î±×·¡¹ÖÀ» ÇÏ´Â ¹æ¹ýÀ» ¼Ò°³ÇÏ¿´´Ù. ¿©±â¼­´Â Ç¥ÁØÀ¸·Î ÀÚ¸®Àâ¾Æ °¡°í ÀÖ´Â Lisp ¹öÀüÀÎ Common Lisp ÀÇ ºÎºÐÁýÇÕÀ» ´Ù·ç¾ú´Ù. ÀÌ°ÍÀº ÀÌ Ã¥¿¡ ³ª¿À´Â ¸ðµç ÇÁ·Î±×·¡¹Ö ¿¹¸¦ ÀÌÇØÇÏ´Â µ¥ ÃæºÐÇÏ°í Lisp ¿¡ °üÇØ ´õ °øºÎÇÒ ¼ö ÀÖµµ·Ï ÇÏ´Â ÈǸ¢ÇÑ ±âÃÊ°¡ µÉ °ÍÀÌ´Ù. ±ÔÄ¢À» ±âÈ£½ÄÀ¸·Î ³ªÅ¸³»°í Ãß·ÐÀ» ¼öÇàÇϱâ À§ÇÏ¿© ½ÄÀ» Á¶ÀÛÇÏ´Â °ÍÀ» ÀÀ¿ë ¿¹·Î µé¾î ¼³¸íÇÏ¿´´Ù. ÀÌ ÀåÀÇ ¸¶Áö¸·¿¡¼­´Â Lisp ·Î ƯÁ¤ÇÑ ±ÔÄ¢±â¹Ý ½Ã½ºÅÛÀ» ±¸ÇöÇÏ´Â ¹æ¹ýÀ» ¼³¸íÇÔÀ¸·Î½á ³¡À» ¸Î¾ú´Ù.

Lisp ÀÇ ¹®¹ýÀº ¸®½ºÆ®ÀÇ ÀϹÝÈ­µÈ ÇüÅÂÀΠǥÇö½ÄÀ» ±âº»À¸·Î ÇÏ°í ÀÖ´Ù. Lisp ÇÁ·Î±×·¥Àº ´ÜÁö ½ÄÀÇ ¿¬¼ÓµÈ ÇüŶó°í º¼ ¼ö ÀÖ´Ù. Lisp ÀÇ Àǹ̷ÐÀû Çؼ®Àº µÎ °³ÀÇ Lisp ÇÁ·Î±×·¥ÀÎ eval °ú apply ÀÇ °üÁ¡¿¡¼­ ¼³¸íÇÒ ¼ö ÀÖ´Ù. ÇÔ¼ö, »ó¼ö, ºÎ¿ï¿¬»êÀ» Æ÷ÇÔÇÏÁö¸¸ °ªÁöÁ¤Àº °®°í ÀÖÁö ¾ÊÀº ¼ø¼ö Lisp ¿¡ ´ëÇÑ ¼³¸íÀ» ¸ÕÀú ÇÏ¿´´Ù. Lisp ¼Ó¿¡ ±¸ÃàµÇ¾î ÀÖ´Â ¸î¸î ÇÔ¼öµéÀº ´Ù¸¥ ÇÔ¼öµé, ƯÈ÷ Àç±ÍÇÔ¼ö¸¦ Á¤ÀÇÇϱâ À§ÇÑ ±â¼ú°ú ÇÔ²² ¼³¸íÇÏ¿´´Ù.

Lisp ¿¡¼­ ±âÈ£¿Í º¯¼ö´Â °°Àº °ÍÀÌ´Ù. °ªÁöÁ¤Àº º¯¼öµé¿¡ ¿¬°üµÇ¾î ÀÖ´Â °ªÀ» º¯°æ½Ãų ¼ö ÀÖµµ·Ï ÇØÁØ´Ù. ȯ°æÀº º¯¼öÀÇ °ªÀ» ÃßÀûÇÏ´Â µ¥¿¡ »ç¿ëµÈ´Ù. Lisp ÀÇ º¯¼öµéÀº ÇÁ·Î±×·¥ÀÇ ¾î¶² ºÎºÐÀÌ º¯¼öÀÇ °ªÀ» º¯°æÇÒ ¼ö Àְڴ°¡¸¦ ½±°Ô °áÁ¤Çϱâ À§Çؼ­ »çÀüÀûÀ¸·Î À¯È¿ ¹üÀ§°¡ °áÁ¤µÈ´Ù. let °ú °°Àº ȯ°æ ±¸¼ºÀÚ´Â ÇÁ·Î±×·¡¸Ó·Î ÇÏ¿©±Ý Áö¿ª º¯¼ö¸¦ »ç¿ëÇÏ°í Áö¿ª»óŸ¦ ÇÔ¼ö¿¡ ¿¬°ü½Ãų ¼ö ÀÖ°Ô ÇØÁØ´Ù. Áö¿ª»óŸ¦ °¡Áø ÇÔ¼ö´Â ÀÌÀüÀÇ È£Ãâ¿¡ ´ëÇÑ Á¤º¸¸¦ º¸°üÇÒ ¼ö ÀÖ´Ù.

Lisp ´Â ÇÔ¼öµéÀ» ´Ù¸¥ ÇÔ¼öÀÇ Àμö·Î Àü´ÞÇÒ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù. Lisp ÀÇ ³»ºÎ ÇÔ¼öµéÀº ÇÔ¼ö°¡ Àμö·Î »ç¿ëµÇ´Â ¼±ÅÃÀûÀÎ Å°¿öµå Àμö¸¦ °¡Áö°í ÀÖ´Ù. ÇÔ¼öÀÇ Å°¿öµå Àμö´Â ÇÁ·Î±×·¡¸Ó·Î ÇÏ¿©±Ý ÀϹÝÀûÀ¸·Î ÇÔ¼öµéÀ» ƯÁ¤ ÀÀ¿ë¿¡ ¸ÂÃß¾î »ç¿ëÇÒ ¼ö ÀÖ°Ô ÇÑ´Ù. ¶ÇÇÑ Æ¯Á¤ ¸ñÀûÀ» À§Çؼ­ ±¸ÃàÇÏ°í »ç¿ë ÈÄ¿¡ ¹ö¸± ¼ö ÀÖ´Â ¶÷´Ù (lambda) ÇÔ¼ö¶ó ºÒ¸®¿ì´Â À̸§ÀÌ ¾ø´Â ÇÔ¼ö¸¦ ¸¸µé ¼ö ÀÖ´Ù.

Lisp ´Â ¸®½ºÆ®¸¦ ¸¸µé°í, Á¢±ÙÇÏ°í, º¯°æÇÏ°í, Ž»öÇϱâ À§ÇÑ ´Ù¾çÇÑ ÇÔ¼öµéÀ» Á¦°øÇÑ´Ù. Lisp ÀÇ ¸®½ºÆ®´Â Æ÷ÀÎÅÍÀÇ Ãß»óÈ­¸¦ Á¦°øÇÏ¿© ¸¹Àº ÀÛ¾÷µéÀ» °£´ÜÇÏ°Ô ¸¸µç´Ù. ±âÈ£¿¡´Â ¸Þ¸ð¸® »óÀÇ ¸®½ºÆ® ±¸Á¶¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍ¿¡ ÇØ´çÇÏ´Â °ªÀÌ ÁöÁ¤µÉ ¼ö ÀÖ´Ù. ¸®½ºÆ®´Â Á¾Á¾ ÁýÇÕ, Å¥ (queue), Æ®¸®, ±×·¡ÇÁ¸¦ Ç¥ÇöÇϱâ À§ÇÑ ¿ø½ÃÀû ÀÚ·á ±¸Á¶·Î »ç¿ëµÈ´Ù. ¶ÇÇÑ ¸®½ºÆ®¸¦ »ç¿ëÇÏ¿© ÇÏÀ§ ´Ü°èÀÇ ÇÁ·Î±×·¡¹Ö ¼¼ºÎ »çÇ×À» °¨Ãß°í Äڵ带 º¸´Ù ½±°Ô ÀÌÇØÇÒ ¼ö ÀÖµµ·Ï Çϱâ À§ÇÑ Ãß»óÀû ÀÚ·áÇüÀ» ±¸ÃàÇÒ ¼ö ÀÖ´Ù.

ÀÌ Ã¥¿¡¼­ ¾Ë°í¸®ÁòÀÌ ÀÚ¿¬½º·´°Ô Àç±ÍÀûÀ¸·Î ±¸ÇöµÇ´Â °æÇâÀ» ¶ì´Â °æ¿ì¿¡ ÀÚÁÖ Àç±ÍÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ °ÍÀÌ´Ù. ¶ÇÇÑ ¹Ýº¹À» ¼³¸íÇϱâ À§ÇÑ ´Ù¸¥ ¹æ¹ýµéµµ ÀÌ¿ëÇÒ °ÍÀÌ´Ù. Lisp ´Â ´ëÀÀÇÔ¼ö¿Í ÀϹÝÀûÀ̸鼭 ƯÁ¤È­µÇ¾îÀÖ´Â ¹Ýº¹ Çü½ÄÀ» Æ÷ÇÔÇÑ ¿©·¯ ¹Ýº¹ ±¸Á¶µéÀ» Áö¿øÇÏ°í ÀÖ´Ù.

ÀԷ°ú Ãâ·ÂÀ» ´Ù·ç°í, µð¹ö±ëÇÏ°í, ÆÄÀÏ¿¡ ÀÖ´Â ÇÔ¼öµéÀ» Æò°¡ÇÏ´Â ±âº» ¹æ¹ýµé¿¡ ´ëÇؼ­ ¼³¸íÇÏ¿´´Ù. ¸¸ÀÏ Lisp ·Î Ä¿´Ù¶õ ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ·Á¸é Lisp ¿¡ ´ëÇØ º¸´Ù ÀÚ¼¼ÇÏ°Ô ¼³¸íµÈ °ÍÀÌ ÇÊ¿äÇÒ °ÍÀÌ´Ù. ±×·¯³ª ´ÙÀ½ ÀåºÎÅÍ ³ª¿À´Â ÇÁ·Î±×·¥µéÀ» ÀÌÇØÇÏ°í ½ÇÇèÇÏ´Â µ¥¿¡ À־´Â ÀÌ Àå¿¡¼­ ¼³¸íÇÑ °ÍÀ¸·Î ÃæºÐÇÒ °ÍÀÌ´Ù.

¹è°æ

Lisp ´Â John McCarthy ¿¡ ÀÇÇؼ­ ¹ß¸íµÇ¾ú°í Lambda Calculus ¶ó°í ºÒ¸®¿ì´Â Çü½Ä ½Ã½ºÅÛ (formal system) ¿¡ ±âº»À» µÎ°í ÀÖ´Ù. Lisp ´Â ÇöÀç±îÁö »ç¿ëµÇ°í ÀÖ´Â ÄÄÇ»ÅÍ ¾ð¾î Áß¿¡¼­ FORTRAN ´ÙÀ½À¸·Î, µÎ¹ø°·Î ¿À·¡µÈ °ÍÀÌ´Ù. Lisp °¡ ¸®½ºÆ®¿Í ±âÈ£½ÄÀ» Á¶ÀÛÇϵµ·Ï °í¾ÈµÈ ù¹ø° ¾ð¾î´Â ¾Æ´Ï¾ú´Ù. IPL À̶ó°í ºÒ¸®¿ì´Â º¸´Ù ÀÌÀüÀÇ ¸®½ºÆ® ó¸® ¾ð¾î°¡ Herbert Simon °ú Allen Newell ¿¡ ÀÇÇؼ­ ÀÚµ¿ ¹®Á¦ÇØ°á¿¡ °üÇÑ ÀÛ¾÷À» À§ÇØ °³¹ßµÇ¾ú´Ù. MaCarthy ´Â Lisp ÀÇ ºÎºÐÁýÇÕÀÌ Æ©¸µ ¸Ó½ÅÀÌ °è»êÇÒ ¼ö ÀÖ´Â ¾î¶°ÇÑ ÇÔ¼öµµ °è»êÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» º¸¿´´Ù [McCarthy, 1960]. ±×´Â ¾î¶²ÇÑ Lisp ÇÔ¼öµµ Çؼ®ÇÒ ¼ö ÀÖ´Â º¸ÆíÀûÀÎ ÇÔ¼ö¸¦ Lisp À¸·Î ¾î¶»°Ô ÀÛ¼ºÇÒ ¼ö Àִ°¡¸¦ º¸ÀÓÀ¸·Î½á Áõ¸íÇÏ¿´´Ù. McCarthy ÀÇ ±× º¸ÆíÀûÀÎ ÇÔ¼ö´Â eval À̶ó°í ºÒ·¶´Ù.

Lisp ´Â ±âÈ£ ÇÁ·Î±×·¡¹ÖÀ» ¿ëÀÌÇÏ°Ô Çϱâ À§ÇØ °í¾ÈµÇ¾ú´Ù. ÁöÀûÇÏÁö´Â ¾Ê¾ÒÁö¸¸ Á¤¸» ÆíÇÏ´Ù°í ´À³¢°Ô µÉ Áß¿äÇÑ Æ¯Â¡ ÁßÀÇ Çϳª´Â ´ëºÎºÐÀÇ ÀÚ·áÇüÀ» À§ÇÑ ÀúÀå¼Ò¸¦ ÇÒ´çÇÏ°í ȸ¼öÇÏ´Â °ÍÀ» Lisp °¡ ´ã´çÇÏ°í ÀÖ´Ù´Â °ÍÀÌ´Ù. ÀÓÀÇÀÇ ¸®½ºÆ® ±¸Á¶¸¦ ¸¸µé°í °è»ê ¼öÇàÀ» À§Çؼ­ ±×°ÍÀ» ÀÓ½ÃÀûÀ¸·Î »ç¿ëÇÏ°í, »ç¿ëÀ» ³¡³ÂÀ» ¶§¿¡ ±×°Í¿¡ ¿¬°üµÈ ÀúÀå¼Ò¸¦ ȸ¼öÇÏ´Â °ÍÀ» ¸ðµÎ Lisp ¿¡ ¸Ã±æ ¼ö ÀÖ´Ù. ¾î¶°ÇÑ ±âÈ£¿¡µµ (Á÷Á¢ÀûÀ¸·Î ¶Ç´Â °£Á¢ÀûÀ¸·Î) ÂüÁ¶µÇ¾î ÀÖÁö ¾ÊÀº ÀúÀå¼Ò¸¦ ÀÚµ¿ÀûÀ¸·Î ȸ¼öÇÏ´Â °ÍÀ» garbage collection À̶ó°í ºÎ¸¥´Ù. garbage collection °ú °°Àº Ư¡Àº ¹Ù¸£°Ô ½Ã¾ÈÀ» ¸¸µé°í ½ÃÇèÀûÀÎ ¿¬±¸ÀÇ ¸ñÀûÀ¸·Î Lisp °¡ ÈǸ¢ÇÏ°Ô »ç¿ëµÉ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù.

¸¸ÀÏ Common Lisp ¿¡ ´ëÇؼ­ Á»´õ ¹è¿ì°í ½Í´Ù¸é Steele ÀÇ Çؼ³ [Steele, 1990] À» Âü°íÇϵµ·Ï Ç϶ó. Lisp ·Î ÇÁ·Î±×·¡¹ÖÇÏ´Â ¹æ¹ýÀ» Á»´õ ¹è¿ì°í ½Í´Ù¸é [Wilensky, 1986] ¿Í °°ÀÌ Common Lisp ¿¡ °üÇÑ Ã¥À̳ª [Touretsky, 1986] ¿Í °°ÀÌ Lisp ¿¡ ´ëÇÑ ÀϹÝÀûÀÎ °³·Ð¿¡ °üÇÑ °ÍÀ» °í·ÁÇÏ´Â °Íµµ ÁÁÀ» °ÍÀÌ´Ù. Scheme À̶ó´Â Lisp ÀÇ º¯Çü¿¡ ´ëÇÑ Lisp ÇÁ·Î±×·¡¹Ö¿¡ÀÇ °³·ÐÀ» À§Çؼ­´Â Abelson °ú Sussman [1985] ¿¡ ÀÇÇÑ Ã¥À» ÂüÁ¶Çϱ⠹ٶõ´Ù.