±âÈ£ ÇÁ·Î±×·¡¹Ö
ÀΰøÁö´É ÀÌ·Ð ¹× ½ÇÁ¦ : Thomas Dean. James Allen. John Aloimonos °øÀú, ±èÁøÇü.¹Ú½Â¼ö.¹éÀº¿Á. ¼Á¤¿¬.ÀÌÀϺ´ °ø¿ª, »çÀÌÅØ¹Ìµð¾î, 1998 (¿ø¼ : Artificial Intelligence: Theory and Practice, 1995), Page 25~70
¸®½ºÆ®¿¡ ¿ø¼Ò¸¦ ¸¸µé°í Á¢±ÙÇϱâ
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 °¡ ½ÇÇàµÇ´Â ÄÄÇ»ÅÍ ¾Õ¿¡ ¾É¾Æ¼ ´ëȵµ±¸¸¦ »ç¿ëÇÏ¸é¼ ½ÇÇèÇ϶ó. ÀÌ ÀåÀº ÇϳªÀÇ ¿¹¸¦ º¸ÀÓÀ¸·Î½á °á·ÐÀ» ¸ÎÀ» °ÍÀÌ´Ù.
¾î¶² ȸ»ç°¡ »ç¹«½Ç ºôµù¿¡¼ ¿ìÆí¹°À» ¹è´ÞÇÏ´Â ·Îº¿À» À§ÇÑ Á¦¾î ½Ã½ºÅÛÀ» °³¹ßÇϰí ÀÖ´Ù. ±×µéÀº ·Îº¿¿¡°Ô ÇÑ »ç¹«½Ç¿¡¼ ´Ù¸¥ »ç¹«½Ç·Î À̵¿ÇÒ ¶§ ¾î¶² º¹µµ¸¦ »ç¿ëÇÒ °ÍÀΰ¡¸¦ ¾Ë¸®´Â »óÀ§±ÞÀÇ °èȹ ½Ã½ºÅÛ (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 Äڵ带 Á¦°øÇÒ °ÍÀÌ´Ù.
Lisp Àº ÇÁ·Î½ÃÀú¸¦ Á¤ÀÇÇÏ°í ´Ù¸¥ ÇÁ·Î½ÃÀú·ÎºÎÅÍ ±× ÇÁ·Î½ÃÀú¸¦ È£ÃâÇÒ ¼ö ÀÖ´Â Á¡¿¡¼ Pascal À̳ª C ¿Í °°Àº ¾ð¾î¿Í ¿©·¯ ¸é¿¡¼ Lisp ´Â ±×°ÍÀÌ º¸´Ù °£´ÜÇÑ ±¸¹®À» °¡Áö°í ÀÖ´Ù´Â °Í°ú, ÀÚ·á ÇüÅÂÀÇ ¸íÈ®ÇÑ ¿ä±¸°¡ Àû´Ù´Â °Í°ú, ¹Ì¸® ±¸ÇöµÇ¾î ÀÖ´Â ³»ºÎ ÇÁ·Î½ÃÀú (built-in procedure) °¡ ¸¹°í ÇÁ·Î±×·¥ °³¹ßÀ» À§ÇÑ ´ëÈÀûÀΠȯ°æÀ» Á¦°øÇÑ´Ù´Â ¸é¿¡¼ ´Ù¸¥ ¾ð¾î¿Í ´Ù¸£´Ù°í ÇÒ ¼ö ÀÖ´Ù. ÀϹÝÀûÀ¸·Î ÇÁ·Î±×·¡¸Ó°¡ Pascal ¿¡ ´ëÇØ¼ ¸»ÇÒ ¶§, Pascal ÇÁ·Î±×·¥À» ¼¼úÇϱâ À§ÇÑ ¹®¹ýÀûÀÎ »çÇ×, ÄÄÆÄÀÏ·¯, ½ÇÇà Äڵ带 »ý¼ºÇϱâ À§ÇÑ °ü·ÃµÈ µµ±¸ ¸ðµÎ¸¦ ÁöĪÇϰí ÀÖ´Ù. ÇÁ·Î±×·¡¸Ó°¡ Lisp ¿¡ ´ëÇØ¼ ¸»ÇÒ ¶§¿¡´Â »ç¿ëÀÚ°¡ ÀÛ¼ºÇÑ Lisp¤ýÇÁ·Î±×·¥°ú ¸¹Àº ³»ºÎ ÇÁ·Î½ÃÀú¸¦ ¼¼úÇÏ´Â ¹®¹ýÀûÀÎ »çÇ×°ú Lisp ÇÁ·Î±×·¥À» ÄÄÆÄÀÏÇÏ°í µð¹ö±ëÇÏ°í ´ëÈÇϱâ À§ÇÑ ¿©·¯ µµ±¸¸¦ ÁöĪÇÏ´Â °ÍÀÌ´Ù.
¿ì¼± ÇÁ·Î±×·¡¹Ö ¾ð¾î¿¡´Â ¹«¾ùÀÌ ÇÊ¿äÇѰ¡¸¦ »ý°¢ÇØ º¸¸é¼ Lisp ¿¡ ´ëÇÑ ¼Ò°³¸¦ ½ÃÀÛÇϵµ·Ï ÇÏÀÚ. ¼ýÀÚ, ¹®ÀÚ¿, Æ÷ÀÎÅÍ µî°ú °°Àº ¸ðµç Ç¥ÁØ ÀÚ·áÇü, ±×·¯ÇÑ ÀÚ·á¿¡ °¡ÇÒ ¼ö ÀÖ´Â ¿¬»êµé, ¿¹¸¦ µé¾î ´õÇϱâ, °öÇϱâ, ¹®ÀÚ¿ ºÙÀ̱â, Æ÷ÀÎÅÍ ÂѾư¡±â µîÀÌ ¿ä±¸µÈ´Ù. ±× ¿Ü¿¡´Â ¼ø¼Ã³¸®, Á¶°ÇºÐ±â, ÇÁ·Î½ÃÀú È£ÃâÀ» Á¦°øÇÏ´Â Á¦¾î ±¸Á¶°¡ ÇÊ¿äÇÏ´Ù. ÆÄÀϰú Å͹̳ΰú °°Àº Ç¥ÁØ ÀåÄ¡·ÎºÎÅÍ ÀÐ°í ¾²´Â ¹æ¹ýµéÀº ½ÇÁ¦ ÀÀ¿ëÀ» À§Çؼ À¯¿ëÇÒ °ÍÀÌ´Ù. ¸¶Áö¸·À¸·Î, ÇÁ·Î±×·¥À» ±¸Á¶ÈÇϱâ À§ÇÑ ¹æ¹ý (¿¹¸¦ µé¾î, ¼ºê·çƾ (subroutine) °ú ¸ðµâ (module)) °ú »õ·Î¿î Á¦¾î ±¸Á¶¿Í Ãß»óÀû ÀÚ·áÇü (abstract data type) À» À§ÇÑ ÀåÄ¡°¡ ÀÖ´Ù¸é º¹ÀâÇÑ ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ´Â µ¥ µµ¿òÀ» ÁÙ °ÍÀÌ´Ù.
Lisp ¿¡´Â ¿©·¯ Á¾·ù°¡ ÀÖ´Ù. ÀÌ Ã¥¿¡¼´Â Common Lisp ¶ó ºÒ¸®¿ì´Â Lisp ¸¦ »ç¿ëÇÑ´Ù. ¿ì¸®´Â ÈξÀ ´Ù¾çÇÑ ´Ù¸¥ Lisp µé ´ë½Å¿¡ Common Lisp ¸¦ ÀÌ¿ëÇϴµ¥, ±×°ÍÀº Common Lisp °¡ ÀϹÝÀûÀ¸·Î ¼ö¿ëµÉ ¼ö Àִ ǥÁØÀÌ µÇ¾ú±â ¶§¹®ÀÌ´Ù. ¿ì¸®´Â Common Lisp °¡ ºÎºÐÁýÇÕ¸¸À¸·Î °ü½É »çÇ×À» Á¦ÇÑÇϰí, ´Ù·ç´Â ´ëºÎºÐÀÇ °ÍÀ» ´Ù¸¥ Lisp µé¿¡µµ ¿ª½Ã Àû¿ëµÉ ¼ö ÀÖ´Â °ÍÀ¸·Î ÇÑ´Ù. ¿ì¸®°¡ ¼±ÅÃÇÑ Common Lisp ÀÇ Æ¯Á¤ ºÎºÐÁýÇÕÀº ÀÌ Ã¥¿¡ ÀÖ´Â ¿¹¿Í ¿¬½À¹®Á¦¸¦ À§ÇØ ÇÊ¿äÇÑ ¸ðµç ±â´ÉµéÀ» Æ÷ÇÔÇϰí, Lisp ¿¡ ´ëÇØ¼ ´õ ¹è¿ï ¼ö ÀÖµµ·Ï ÇÏ´Â ÁÁÀº ¹Ø°Å¸§À» Á¦°øÇÒ °ÍÀÌ´Ù. ÀÌ·¯ÇÑ ºÎºÐÁýÇÕÀ» »ç¿ëÇÒ ¼ö ÀÖµµ·Ï Çϱâ À§Çؼ, ÀÌ Ã¥ÀÇ µÞºÎºÐ¿¡ ÀϹÝÀûÀÎ ±âÈ£ ÇÁ·Î±×·¡¹Ö ¿ë¾î, ÇÔ¼ö À̸§, Ư¼ö Çü½Ä (special form), Ư¼ö ¹®ÀÚ¿Í °°Àº 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 ÀÇ °¡Àå Áß¿äÇÑ Æ¯¼º ÁßÀÇ ÇϳªÀÌ´Ù.
¶Ç ´Ù¸¥ 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 ÇÁ·Î±×·¥À» Æ÷ÇÔÇϰí ÀÖ´Â ÆÄÀÏ¿¡¼ ÈçÈ÷ º¼ ¼ö ÀÖ´Â ÁÖ¼®ÀÇ ¿¹¸¦ º¸¿©ÁÖ°í ÀÖ´Ù.
Á»´õ ÁøÇàÇϱâ À§Çؼ Lisp ÀÇ Àǹ̿¡ ´ëÇØ¼ Á»´õ ¾Ë¾Æº¼ Çʿ䰡 ÀÖ´Ù. À̰ÍÀº ÀüÅëÀûÀÎ ¾ð¾î¿¡¼ ÄÄÆÄÀÏ, ¸µÅ· (linking), ±×¸®°í ÇÁ·Î±×·¥À» ½ÇÇàÇÏ´Â ¹æ¹ý¿¡ ÇØ´çÇÑ´Ù. ¿ì¸®´Â Lisp ¿¡¼ ´Ù¸¥ Lisp ÇÁ·Î±×·¥À» ÇØ¼® (interpret) ÇÏ°í Æò°¡ (evaluate) ÇÏ´Â eval À̶ó´Â Lisp ÇÁ·Î±×·¥À» ÁýÁßÀûÀ¸·Î »ìÆìº¼ °ÍÀÌ´Ù. Eval Àº ´Ù¸¥ ÇÁ·Î±×·¡¹Ö ¾ð¾î¿¡¼ ÄÄÆÄÀÏ·¯°¡ ÇÏ´Â °Í°ú °°Àº ÀÏÀ» ÇÑ´Ù. Eval ·Î Lisp ÇÁ·Î±×·¥À» º¹ÀâÇÑ ¸µÅ·¾øÀÌ Á¡ÁøÀûÀ¸·Î ÄÄÆÄÀÏÇÒ ¼ö ÀÖ´Ù´Â »ç½ÇÀº, Lisp ÄÚµå·Î °£´ÜÇÏ°Ô ½ÇÇèÇÒ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù. Common Lisp Àº eval ¿¡ ÀÇÇÑ ÄÄÆÄÀÏ ¸»°íµµ ´Ù¸¥ ÄÄÆÄÀÏ Çüŵµ Á¦°øÇϴµ¥, ÀÌ Ã¥¿¡¼´Â ±×°ÍÀ» ´Ù·çÁö ¾Ê°Ú´Ù.
´ëºÎºÐÀÇ Lisp ½Ã½ºÅÛÀº »ç¿ëÀÚ·Î ÇÏ¿©±Ý Lisp ½ÄÀ» Å͹̳ο¡¼ ÀÔ·ÂÇϰí eval À» ½ÇÇà½Ãų ¼ö ÀÖµµ·Ï ´ëÈÀûÀÎ ÇÁ·Î±×·¥À» Á¦°øÇϰí ÀÖ´Ù. ÀÌ·¯ÇÑ ´ëÈ ÇÁ·Î±×·¥À» read-eval-print ·çÇÁ (loop) ¶ó°í ºÎ¸£´Âµ¥, À̰ÍÀÌ Å͹̳ηκÎÅÍ ÇϳªÀÇ ½ÄÀ» Àаí, ±× ½ÄÀ» Æò°¡Çϰí, ±×¸®°í Æò°¡ÀÇ °á°ú¸¦ Å͹̳ηΠÃâ·ÂÇÏ¸é¼ ¶Ç ´Ù¸¥ ½ÄÀÇ ÀÔ·ÂÀ» ¿ä±¸Çϱ⠶§¹®ÀÌ´Ù. ¿ì¸®´Â ÇØ¼®±â (interpreter) ¶ó ºÎ¸£´Â ÀÌ·¯ÇÑ ´ëÈÀûÀÎ ÇÁ·Î±×·¥À» ¾ÕÀ¸·Î °è¼Ó »ç¿ëÇÒ °ÍÀε¥, °¡´ÉÇÏ´Ù¸é Å͹̳Π¾Õ¿¡¼ À̰ÍÀ» Á÷Á¢ ¼öÇàÇÏ¸é¼ µû¶ó¿À±â ¹Ù¶õ´Ù. ÁÖÀ§¿¡ ÀÖ´Â Lisp Àü¹®°¡¿¡°Ô ÇØ¼®±â¸¦ ¾î¶»°Ô ½ÇÇà½ÃŰ°í ¿À·ù¸¦ ¾î¶»°Ô ±Øº¹ÇÏ´ÂÁö¸¦ ¹°¾î º¸¶ó. ½ÇÇèÇØ º¸´Â °ÍÀ» ¾î·Á¿öÇÏÁö ¸»¶ó. ÇØ¼®±â´Â ŽÇèÀ» µµ¿ÍÁÖµµ·Ï ¼³°èµÇ¾î ÀÖ´Ù.
Lisp ÇØ¼®±â°¡ ½ÇÇàµÇ¸é ÀϹÝÀûÀ¸·Î ¹öÀüÀ» ³ªÅ¸³»´Â ¼ýÀÚ, º¹Á¦¿¡ ´ëÇÑ Á¦ÇÑ »çÇ×, ±×¸®°í ÀÌ ´Ü°è¿¡¼ ¹«½ÃÇÒ ¼ö ÀÖ´Â ´Ù¸¥ Á¤º¸¿¡ °üÇÑ ¿©·¯ ¸Þ½ÃÁö°¡ ÇÁ¸°Æ®µÈ´Ù. ÀÌ·¯ÇÑ Ã¹ Àλ簡 ³¡³ª¸é, ´ç½ÅÀÌ Å¸ÀÌÇÎÀ» ½ÃÀÛÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» ¾Ë¸®´Â ÇÁ·ÒÇÁÆ® (prompt) ¸¦ Ç¥½ÃÇÑ´Ù. ÇØ¼®±â´Â ÇϳªÀÇ ¿ÏÀüÇÑ ½ÄÀ» ±â´Ù¸°´Ù. ÀÌ·¯ÇÑ ½ÄÀ» ŸÀÌÇÎÇÑ ÈÄ¿¡ ¸®ÅÏÀ» Ä¡¸é ÇØ¼®±â´Â ±×°ÍÀ» Àаí, Æò°¡ÇÏ°í ±×¸®°í °á°ú¸¦ Ãâ·ÂÇÑ´Ù. ¿¹¸¦ µé¾î, Lisp ¿¡¼ ¹®ÀÚ¿°ú ¼ýÀÚ´Â ÀÚ±â ÀÚ½ÅÀ¸·Î Æò°¡µÈ´Ù.
> "string"
"string"
>
3.14
3.14
±âÈ£¿Í ½ÄÀº ´Ù¸£°Ô Ãë±ÞµÈ´Ù. ÇØ¼®±â¿¡ ¾Æ¹« ±âÈ£³ª ÀÔ·ÂÇϸé, ¾Æ¸¶µµ ¿À·ù°¡ ¹ß»ýÇÒ °ÍÀÌ´Ù. ÀÌ Ã¥¿¡¼ »ç¿ëÇÏ´Â ÇØ¼®±â´Â ¸ðµç ±âÈ£¸¦ ´ë¹®ÀڷΠǥ½ÃÇÏ´Â °Í¿¡ À¯ÀÇÇ϶ó. À̰ÍÀº ´ëºÎºÐÀÇ Lisp ½Ã½ºÅÛµéÀÌ »ç¿ëÇÏ´Â ¹æ¹ýÀÌ´Ù.
> sym
Error:
The symbol SYM has no global value
³ªÁß¿¡ ÇϳªÀÇ ±âÈ£°¡ Àü¿ª°ª (global value) À» °®´Â´Ù´Â °ÍÀÌ ¾î¶² ÀǹÌÀÌ°í ±×°ÍÀ» ¾î¶»°Ô ÁöÁ¤Çϴ°¡¸¦ ¸íÈ®È÷ ¼³¸íÇÒ °ÍÀÌ´Ù. ¿ì¼± Áö±ÝÀº, ¾î¶² ±âÈ£µéÀº Àü¿ª°ªÀ» °®´Â´Ù´Â °ÍÀ» ¾Æ´Â °Í¸¸À¸·Î ÃæºÐÇÏ´Ù. ƯÈ÷, t ¿Í nil À̶ó´Â ±âÈ£´Â Lisp ÀÇ ±âº» ºÎ¿ï°ª (default boolean value) Àε¥, ±×°ÍµéÀº ÀÚ±â ÀÚ½ÅÀ¸·Î Æò°¡µÈ´Ù. Lisp ¿¡¼ t ´Â ºÎ¿ï Âü (boolean true) ¿¡ ÇØ´çÇϰí, nil Àº ºÎ¿ï °ÅÁþ (boolean false) ¿¡ ÇØ´çÇÑ´Ù. Nil °ú °ø ¸®½ºÆ® ( ) ´Â ÀÌ ÀåÀÇ µÞºÎºÐ¿¡¼ ¼³¸íÇϰÚÁö¸¸ °°Àº ±âÈ£ÀÌ´Ù.
> t
t
>
nil
nil
ÁßøµÈ ¸®½ºÆ®´Â ¸®½ºÆ®ÀÇ °ýÈ£¸¦ ¿Ã¹Ù·Î ¸ÂÃß¾î¾ß Çϱ⠶§¹®¿¡ Ãʺ¸ÀÚ°¡ ÀÔ·ÂÇϱ⠾î·Á¿öÇÑ´Ù. ¿ì¸®´Â ¾ÕÀ¸·Î ´ç½ÅÀÌ ÇØ¼®±â¿Í ´ëÈÇÏ´Â °Í¿¡ ´ëÇØ¼ µµ¿ò¸»À» ÁÖÁö ¾ÊÀ» °ÍÀÌ´Ù. ´ç½ÅÀº ÇÊ¿äÇÒ ¶§, ¸Å´º¾óÀ̳ª ¿·¿¡ ÀÖ´Â Lisp Àü¹®°¡¿¡°Ô Á¶¾ðÀ» ±¸Çϱ⠹ٶõ´Ù. ¾Æ¸¶µµ ´ç½ÅÀÇ Lisp ´Â ÀÚµ¿ÀûÀ¸·Î °ýÈ£¸¦ ¸ÂÃß°í, ÁÙ¸ÂÃã (indentation) À» Á¶ÀýÇÏ°í ±× ¹Û¿¡µµ Á»´õ »ý»êÀûÀÎ ±â´ÉÀ» Æ÷ÇÔÇϰí ÀÖÀ» °ÍÀÌ´Ù.
¸¸ÀÏ ÇØ¼®±â¿¡ ÀÔ·ÂµÈ ½ÄÀÌ ¹®ÀÚ¿, ¼ýÀÚ, ±âÈ£ ¶Ç´Â ´Ù¸¥ ¿ø½Ã °´Ã¼°¡ ¾Æ´Ï¸é, ±×°ÍÀº ¸®½ºÆ®À̾î¾ß ÇÑ´Ù. ±×°ÍÀÌ ¸®½ºÆ®¶ó¸é Ư¼ö Çü½Ä (special form) À̰ųª, ÇϳªÀÇ ÇÔ¼ö¸¦ È£ÃâÇϴ ǥÇö½ÄÀ̾î¾ß ÇÑ´Ù. ¿ì¸®´Â ÀÌ Ã¥¿¡¼ ÇÔ¼ö¶ó´Â ¿ë¾î¿Í ÇÁ·Î½ÃÀú¶ó´Â ¿ë¾î¸¦ °°ÀÌ »ç¿ëÇÑ´Ù. Ư¼ö Çü½ÄÀº Á¶°Ç¹®°ú Lisp ¿¡ ÀÇÇØ Ưº°È÷ ´Ù·ç¾îÁö´Â Á¦¾î ±¸Á¶ÀÇ È帧À» ¸»ÇÑ´Ù.
ÇÔ¼ö´Â ±âÈ£¸¦ ÇÔ¼ö¿¡ ´ëÀÀ½ÃŰ´Â ÇϳªÀÇ Àü¿ª Å×À̺í (global table) ¿¡ ÀúÀåµÇ¾î ÀÖ´Ù°í °¡Á¤ÇÑ´Ù. ½ÇÁ¦ Common Lisp ÀÇ °æ¿ì¿¡ ²À ±×·¸°Ô µÇ¾î¾ß ÇÒ ÇÊ¿ä´Â ¾ø´Ù. ±×·¯³ª ÀÌ·¸°Ô °¡Á¤ÇÏ¸é ¼³¸íÀ» ½±°Ô ÇÒ ¼ö ÀÖ´Ù. Eval Àº ÇÔ¼öÀÇ È£ÃâÀ» ´Ù·ç±â À§Çؼ ¶Ç ´Ù¸¥ Lisp ÇÁ·Î±×·¥ÀÎ apply ¸¦ »ç¿ëÇÑ´Ù. Apply ´Â µÎ °³ÀÇ Àμö¸¦ ÃëÇϴµ¥, ÇϳªÀÇ ÇÔ¼ö¿Í 0 °³ ÀÌ»óÀÇ Àμö·Î ÀÌ·ç¾îÁø ¸®½ºÆ®¸¦ ÃëÇÑ´Ù. Eval °ú apply ´Â ´ÙÀ½°ú °°ÀÌ ÇÔ²² µ¿ÀÛÇÑ´Ù.
¨ç eval Àº ÇÔ¼ö È£Ãâ¿¡ ÇØ´çÇÏ´Â ¸®½ºÆ®¿¡¼ ±× ¸®½ºÆ®ÀÇ Ã¹¹øÂ° ¿ä¼Ò¿Í ±× ³ª¸ÓÁö ¿ä¼Òµé·Î ÀÌ·ç¾îÁø Àμö ¸®½ºÆ®¸¦ »Ì¾Æ³½´Ù.
¨è ¸®½ºÆ®ÀÇ Ã¹¹øÂ° ¿ä¼Ò°¡ ±âÈ£°¡ ¾Æ´Ï°Å³ª ¶Ç´Â ±× ±âÈ£°¡ Àü¿ª Å×À̺í (global table) ¿¡ ÀÖ´Â ÇÔ¼öµé°ú °ü·ÃµÇ¾î ÀÖÁö ¾ÊÀ¸¸é, eval Àº ¿À·ù¸¦ ¹ß»ý½Ã۰í, ±×·¸Áö ¾ÊÀ¸¸é eval Àº ±× ±âÈ£¿Í ¿¬°üµÇ¾î ÀÖ´Â ÇÔ¼ö¿Í ÀμöÀÇ ¸®½ºÆ®¸¦ apply ·Î ³Ñ±ä´Ù.
¨é Apply ´Â eval À» ÀÌ¿ëÇØ¼ ÀμöÀÇ ¸®½ºÆ®¸¦ ¿ÞÂÊ¿¡¼ ¿À¸¥ÂÊÀÇ ¼ø¼·Î Æò°¡ÇÑ´Ù.
¨ê Apply ´Â ±× ÇÔ¼ö¿Í ¿¬°üµÇ¾î ÀÖ´Â Á¤ÀÇ (definition) ºÎºÐÀ» »Ì¾Æ³½´Ù. ¸¸ÀÏ ±× Á¤ÀÇ¿¡ ¿¬°üµÇ¾î ÀÖ´Â Çü½Ä ¸Å°³º¯¼ö (formal parameter) ÀÇ °³¼ö°¡ ÀμöÀÇ ¼ö¿Í ´Ù¸£¸é apply ´Â ¿À·ù¸¦ ¹ß»ý½ÃŲ´Ù.
¨ë Apply ´Â ¼¼¹øÂ° ´Ü°èÀÇ °á°úµéÀ» ÇÔ¼ö Á¤ÀÇÀÇ º¹»çº»¿¡ ÀÖ´Â Çü½Ä ¸Å°³º¯¼öµé·Î ġȯÇÏ°í °á°ú·Î »ý±ä ½ÄÀ» Æò°¡Çϱâ À§Çؼ eval ·Î º¸³½´Ù.
¾ÕÀÇ ¼³¸íÀº ÇÔ¼ö È£ÃâÀ» À§ÇÑ Ä¡È¯¸ðµ¨ (substitution model) À̶ó°í ºÎ¸¥´Ù. ġȯ¸ðµ¨¿¡¼ ÇÔ¼öÀÇ È£ÃâÀ̶õ ±× ÇÔ¼ö Á¤ÀÇÀÇ º¹»çº»¿¡ ÀÖ´Â Çü½Ä ¸Å°³º¯¼ö¸¦ °ªÀ¸·Î ġȯÇÏ°í ±× °á°ú·Î »ý±ä ½ÄÀ» Æò°¡ÇÏ´Â °ÍÀÌ´Ù. ÀÌÁ¦ Lisp °¡ ¾î¶»°Ô ÇÔ¼ö È£ÃâÀ» ´Ù·ç´ÂÁö¸¦ ¾Ë¾Æº¸¾ÒÀ¸´Ï È£ÃâÇÒ ÇÔ¼öµéÀ» ¾Ë¾Æº¸ÀÚ.
Common Lisp ´Â ³»ºÎ ÇÔ¼ö (built-in function) ¸¦ ¸¹ÀÌ °¡Áö°í ÀÖ´Ù. ÇÔ¼ö°¡ ¾î¶² °ÍÀÌ ÀÖ´ÂÁö¸¦ ´ëÃæ ¾Ë¾Æº¸±â À§Çؼ ÂüÁ¶ ¸Å´º¾ó (Steele [1990]) À» ÈÈ¾î º¼ ¼ö ÀÖ´Ù. ³Î¸® »ç¿ëµÇ°í ÀÖ´Â ´Ù¸¥ ÇÁ·Î±×·¡¹Ö ¾ð¾î¿¡¼ ãÀ» ¼ö ÀÖ´Â ÇÔ¼öµéÀº ´ëºÎºÐÀº Common Lisp ¿¡¼µµ ¾î¶°ÇÑ ÇüÅ·εç ãÀ» ¼ö ÀÖ´Ù. ¼ö½Ä ¿¬»ê¿¡ ´ëÇØ¼ Common Lisp ´Â Çϳª ÀÌ»óÀÇ Àμö¸¦ ¼ö¹ÝÇÏ´Â ´õÇϱâ (+), »©±â (-), °öÇϱâ (*), ³ª´©±â (/) ¿¡ ´ëÇÑ ÇÔ¼öµéÀ» Æ÷ÇÔÇϰí ÀÖ´Ù. À̵é ÇÔ¼ö´Â Á¤¼ö¿Í ½Ç¼öÀÇ ¾î¶°ÇÑ È¥ÇÕµµ ÇÕ¸®ÀûÀ¸·Î ¼öÇàÇÒ ¼ö ÀÖµµ·Ï °í·ÁµÇ¾ú´Ù. ´ÙÀ½Àº ¼¼ °³ÀÇ ¼ö¸¦ ´õÇÏ´Â ¿¹¿Í 4 ·ÎºÎÅÍ 2 ¿Í 1 ¸¦ »©´Â ¿¹¸¦ º¸À̰í ÀÖ´Ù.
> (+ 3 4 5)
12
>
(- 4 2 1)
1
±×¸² 3 ÁßøµÈ ÇÔ¼öÀÇ Æò°¡ ¼ø¼
ÇϳªÀÇ ÇÔ¼ö È£Ãâ¿¡ ÇØ´çÇÏ´Â ¸®½ºÆ®¸¦ Æò°¡ÇÒ ¶§ Àμö´Â ¿ÞÂÊ¿¡¼ ¿À¸¥ÂÊÀÇ ¼ø¼·Î Æò°¡µÈ´Ù. ÁßøµÈ ÇÔ¼ö È£Ãâ ½ÃÀÇ Æò°¡ ¹æ¹ýÀº °¡Àå ±íÀº °÷¿¡ ÀÖ´Â Àμö¸¦ ¸ÕÀú Æò°¡ÇÏ´Â ¹æ½ÄÀ¸·Î ÀÌ·ç¾îÁö°Ô µÈ´Ù. ±×¸² 3 Àº ´ÙÀ½ È£Ãâ·ÎºÎÅÍ ±âÀÎÇÏ´Â Æò°¡ Æ®¸® (evaluation tree) ¸¦ º¸¿©ÁÖ°í ÀÖ´Ù. ºÎ Ç¥Çö½Ä (subexpression) ÀÇ Æò°¡ ¼ø¼´Â [ ] ¿¡ ÀÖ´Â ¼ýÀڷΠǥ½ÃµÇ¾î ÀÖ´Ù.
> (+ (*
(+ 1 2) 3) (/ 12 2))
15
ºÎ Ç¥Çö½ÄÀ» ÀûÀýÈ÷ ÁÙ¸ÂÃã (indentation) ÇÔÀ¸·Î½á Æò°¡Æ®¸®¸¦ È®½ÇÇÏ°Ô º¸ÀÏ ¼ö ÀÖ´Ù.
> (+ (*
(+ 1
2)
3)
(/ 12
2))
15
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 ¶ó´Â ÇÔ¼ö°¡ ÀÖ´Ù.
> (defun nex-odd-number
(n)
(if (evenp n)
(+
n 1)
(+
n 2))
NEXT-ODD-NUMBER
> (next-odd-number 1)
3
¿ì¸®´Â or, and, not ÀÇ ºÎ¿ï ¿¬»êÀÚ (boolean operator) ¸¦ »ç¿ëÇÏ¿© º¸´Ù º¹ÀâÇÑ Å×½ºÆ®¸¦ ¸¸µé ¼ö ÀÖ´Ù.
> (or (oddp
2) (and (not (oddp 4)) (evenp 6)))
T
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 ¿¡ ÀÇÇØ¼ ³ª´©¾îÁú ¼ö ÀÖ´ÂÁö¸¦ °áÁ¤ÇÑ´Ù.
> (defun primep
(n)
(cond ((>= n 49) (princ ( "Can't
count that high.") nill)
((or
(= n 2) (= n 3) (= n 5)) t)
((or
(= (mod n 2) 0)
(=
(mod n 3) 0)
(=
(mod n 5) 0)) nil)
(t
t)))
> (primep 32)
NIL
> (primep 37)
T
> (primep 76)
Can't
count that high.
NIL
ÇÔ¼ö primep ¿¡¼ t (ÀÚ½ÅÀ» Æò°¡ÇÏ´Â ÇϳªÀÇ ±âÈ£) ´Â Ç×»ó ¼º°øÇÏ´Â Å×½ºÆ®ÀÇ ¿ªÇÒÀ» ÇÑ´Ù. ¾î¶² Å×½ºÆ®µµ ¼º°øÇÏÁö ¾Ê´Â cond ¹®À» ÀÛ¼ºÇÏ´Â °ÍÀº ¾È ÁÁÀº ÇüŶó°í »ý°¢ÇÑ´Ù. µû¶ó¼, Á¾Á¾ ¸¶Áö¸· clause °¡ (t body) ÀÇ ÇüÅÂÀÎ cond ¹®À» º¸°Ô µÉ °ÍÀÌ´Ù.
Àç±ÍÀûÀÎ (recursive) ¹®Á¦ÇØ°á ¹æ¹ýÀº ÁÖ¾îÁø ¹®Á¦¸¦ Çϳª ÀÌ»óÀÇ º¸´Ù °£´ÜÇÑ ¹®Á¦µé·Î ÁÙÀ̰í, ±× °£´ÜÇÑ ¹®Á¦µéÀ» ÇØ°áÇϱâ À§Çؼ ÀÚ±â ÀÚ½ÅÀ» Àû¿ëÇÑ´Ù. ±×°ÍÀº ¹®Á¦°¡ ´õ ÀÌ»ó ÁÙ¿©ÁöÁö ¾ÊÀ» ¶§±îÁö ½±°Ô ÇØ°áµÉ ¼ö ÀÖ´Â ¹®Á¦µéÀÇ Á¶°¢À¸·Î °è¼ÓÇØ¼ ³ª´«´Ù. ÀÌ·¯ÇÑ ¹æ½ÄÀ¸·Î µ¿ÀÛÇÏ´Â ÇÔ¼ö¸¦ Á¤ÀÇÇÒ ¼ö ÀÖ´Ù.
ÀÌ Ã¥¿¡¼ ¼¼úÇÏ´Â ¸¹Àº ÇÔ¼öµéÀº Àç±ÍÀûÀ¸·Î Á¤ÀǵǾî ÀÖ´Ù. Àç±ÍÇÔ¼ö (recursive function) ¶õ ±× ÇÔ¼ö°¡ ±×°ÍÀÇ Á¤ÀÇ ºÎºÐ¿¡¼ Àç±ÍÀûÀ¸·Î È£ÃâµÇ´Â ÇÔ¼ö¸¦ ¸»ÇÑ´Ù. Àç±Í È£Ãâ¿¡¼´Â ÀϹÝÀûÀ¸·Î ¿ø·¡ÀÇ ÀμöÀÇ Å©±â¸¦ Á¡Á¡ ÁÙ¿©°¡¸é¼ ¹®Á¦¸¦ ÇØ°áÇÑ´Ù. °¢ Àç±Í È£ÃâÀº º£À̽º ÄÉÀ̽º (base-case) ¶ó´Â ÆÇ´Ü±âÁØÀÌ ¸¸Á·ÇÒ ¶§±îÁö °è¼ÓÇØ¼ ¹®Á¦¸¦ ÁÙ¿©³ª°£´Ù.
ÇÔ¼ö raise ´Â ÇϳªÀÇ ¼ýÀÚ¿Í À½ÀÌ ¾Æ´Ñ Á¤¼ö n ÀÇ µÎ °³ÀÇ Àμö¸¦ ÃëÇϰí, n Á¦°öÀ¸·Î °è»êµÈ ¼ö¸¦ ¸®ÅÏÇÑ´Ù. ±×°ÍÀÇ Àç±ÍÇÔ¼ö´Â ´ÙÀ½°ú °°´Ù.
> (defun raise
(x n)
(if (= n 0)
1)
* x (raise
x (- n 1)))))
RAISE
> (raise 3 3)
27
Àç±Í È£ÃâÀ» À§ÇÑ º£À̽º ÄÉÀ̽º (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 ÀÇ ¾îµò°¡¿¡ ³õ¾Æ¾ß ÇÑ´Ù.
¾Õ¼± Åä·Ð¿¡¼ °ªÁöÁ¤ (assignment) ÀÇ Ç¥±â¿¡ ´ëÇÑ »çÇ×Àº ¼Ò°³ÇÏÁö ¾Ê¾Ò´Ù. »ç½Ç, ½ÉÁö¾î º¯¼ö (variable) ¶õ ´Ü¾îÁ¶Â÷µµ ¾ð±ÞÇÏÁö ¾Ê¾Ò´Ù. ÇÔ¼ö Á¤ÀÇ¿¡¼ Çü½Ä ¸Å°³º¯¼öÀÇ Ä¡È¯¿¡ ´ëÇØ¼´Â À̾߱âÇßÁö¸¸, Çü½Ä ¸Å°³º¯¼ö¿¡ °ªÀ» "ÁöÁ¤" ÇÒ ¼ö´Â ¾ø¾úÀ» °ÍÀÌ´Ù. defun À¸·Î ÇÔ¼ö Á¤ÀǸ¦ ±âÈ£·Î ÁöÁ¤ÇÒ ¼ö ÀÖ´Â °ÍÀº »ç½ÇÀÌ´Ù. ÇÏÁö¸¸, ´ÙÀ½ Àý¿¡¼ ¾ð±ÞÇÒ À̸§¾ø´Â ÇÔ¼ö¸¦ »ç¿ëÇÔÀ¸·Î½á defun À» ÇÇÇÒ ¼öµµ ÀÖ´Ù. ÇÔ¼ö À̸§ÀÌ ¾Æ´Ñ ±âÈ£µéÀº t ³ª nil °°Àº »ó¼ö¿´´Ù. ÀÌÁ¦±îÁö ¼Ò°³ÇÑ Lisp ÀÇ ºÎºÐÁýÇÕÀº ±âº»ÀûÀ¸·Î ¼ø¼ö Lisp ÀÌ´Ù. Áï ÇÔ¼ö, »ó¼ö, ºÎ¿ï ¿¬»êÀÚ¸¸À» °®°í, °ªÁöÁ¤ÀÌ ¾ø´Â Lisp ÀÌ´Ù. °è¼ÓÇØ¼ °ªÁöÁ¤°ú º¯¼ö¸¦ Lisp ¿¡ Ãß°¡ÇÒ °ÍÀÌ°í ±×·¸°Ô ÇÔÀ¸·Î½á Lisp °¡ ¸Þ¸ð¸®¸¦ »ç¿ëÇÏ´Â ¸î °¡Áö ¹æ¹ý¿¡ ´ëÇØ È®½ÇÇÏ°Ô ¼³¸íÇÒ °ÍÀÌ´Ù.
»ç½Ç Lisp ¿¡¼ º¯¼ö¿Í ±âÈ£°£¿¡ Â÷ÀÌÁ¡Àº ¾ø°í ±× ¿ë¾î¸¦ ¹Ù²Ù¾î ¾²±âµµ ÇÑ´Ù. ±âÈ£´Â ¹Ù²Ü ¼ö ÀÖ´Â °ª (value) À» °¡Áö°í ÀÖ´Ù. Lisp ¿¡¼ÀÇ ±âÈ£´Â °ª¿¡ ÀÇÇÑ È£Ãâ (call-by-value) º¯¼ö¸¦ »ç¿ëÇÏ´Â ¾ð¾î¿¡¼ÀÇ º¯¼ö¿¡ ÇØ´çÇÑ´Ù. ¿ì¸®´Â setq (set equal ¿¡¼ ±âÀÎÇÔ) ¶ó´Â Ư¼ö Çü½ÄÀ» »ç¿ëÇÏ¿© ±âÈ£ÀÇ °ªÀ» ÁöÁ¤Çϰųª ¹Ù²Ü ¼ö ÀÖ´Ù.
> (setq sym
2)
2
> sym
2
> (setq sym 3)
3
> sym
3
setq ´Â ÃÖ¼ÒÇÑ µÎ °³ÀÇ Àμö¸¦ °®´Âµ¥, ù¹øÂ° °ÍÀº ¹Ýµå½Ã ±âÈ£ÀÌ¸é¼ Æò°¡µÇ¾î¼´Â ¾ÈµÇ°í, µÎ¹øÂ° °ÍÀº ¾î¶² ½ÄÀÌ¶óµµ µÉ ¼ö ÀÖ°í Æò°¡µÈ´Ù.
> (setq new sym)
3
>
new
3
Setq ´Â (setq new 1 old 0) °ú °°ÀÌ ¿©·¯ °³ÀÇ ±âÈ£ÀÇ °ªÀ» Çѹø¿¡ ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù.
Eval ÀÌ ±âÈ£¸¦ ¸¸³ª¸é Å×ÀÌºí °°Àº ±¸Á¶¿¡¼ ±× ±âÈ£ÀÇ °ªÀ» ã´Â´Ù. ¸¸ÀÏ ±× Å×ÀÌºí¿¡ ±× ±âÈ£¿¡ ´ëÇÑ ¾Æ¹«·± µî·Ï »çÇ×ÀÌ ¾øÀ¸¸é ¿À·ù¸¦ º¸°íÇÑ´Ù. ±× ±¸Á¶´Â ȯ°æ (environment) À̶ó°í Çϴµ¥, eval Àº ã¾Æ¾ß ÇÒ Àû´çÇÑ È¯°æÀ» ¾Ë¾Æ³»¾ß ÇÑ´Ù. ¾ÕÀÇ ¿¹¿¡¼ eval Àº Àü¿ª ȯ°æ (global environment) ¿¡¼ ±âÈ£°ªÀ» ã´Â´Ù. ³ªÁß¿¡ ¾î¶»°Ô ºÎ°¡ÀûÀΠȯ°æÀÌ »ý¼ºµÇ°í, eval ¿¡ ÀÇÇØ¼ ÂüÁ¶µÇ´ÂÁö¸¦ ¼³¸íÇÒ °ÍÀÌ´Ù.
Common Lisp ¿¡¼ ±âÈ£´Â ±×°ÍÀÌ ÇÔ¼öÀÇ Àμö·Î ³ªÅ¸³¯ ¶§ »ç¿ëµÇ´Â °ª°ú, ±×°ÍÀÌ ÇÔ¼ö È£Ãâ·Î ÇØ¼®µÇ´Â ¸®½ºÆ®ÀÇ Ã¹¹øÂ° ¿ø¼Ò·Î ³ªÅ¸³¯ ¶§ »ç¿ëµÇ´Â ÇÔ¼öÁ¤ÀǸ¦ °¡Áú ¼ö ÀÖ´Ù.
ÀÌ ½ÃÁ¡¿¡¼ ±âÈ£¿Í ȯ°æÀ» °í·ÁÇÏ´Â eval °ú apply ÀÇ µ¿ÀÛ¿¡ ´ëÇØ¼ ´Ù½Ã »ý°¢Çغ¸ÀÚ. Eval Àº ½Ä¿¡ ÇØ´çÇÏ´Â ÇϳªÀÇ Àμö¸¦ °®´Â´Ù. ¶ÇÇÑ, eval ¿¡°Ô´Â ¿ì¼± ÇϳªÀÇ È¯°æÀ¸·Î Àü¿ª ȯ°æÀÌ ÁÖ¾îÁø´Ù. ´ÙÀ½¿¡ eval ÀÇ µ¿ÀÛÀ» ¼³¸íÇÏ´Â ÀÇ»çÄÚµå (pseudo code) °¡ ÀÖ´Ù.
¨ç ¸¸ÀÏ ½ÄÀÌ ¼ýÀÚ È¤Àº ¹®ÀÚ¿ÀÌ¸é ±× ½ÄÀ» ¸®ÅÏÇÑ´Ù.
¨è ¸¸ÀÏ ½ÄÀÌ ±âÈ£À̸é ȯ°æ¿¡¼ ±×°ÍÀÇ °ªÀ» ã´Â´Ù.
¨é ¸¸ÀÏ ½ÄÀÌ Æ¯¼ö Çü½Ä (special form) ÀÌ¸é ±×¿¡ ¾Ë¸Â°Ô ó¸®ÇÑ´Ù.
¨ê ¸¸ÀÏ ½ÄÀÌ ¸®½ºÆ®ÀÌ¸é¼ Æ¯¼ö Çü½ÄÀÌ ¾Æ´Ï¸é ¸®½ºÆ®ÀÇ Ã¹¹øÂ° Ç׸ñ¿¡ ÇØ´çÇÏ´Â ±âÈ£¿Í °ü·ÃµÈ ÇÔ¼ö¿Í ¸®½ºÆ®ÀÇ ³ª¸ÓÁö ºÎºÐ¿¡ ÇØ´çÇÏ´Â ÀμöµéÀ» apply ¿¡ º¸³½´Ù.
¾Õ Àý¿¡¼ ġȯ¸ðµ¨À» »ç¿ëÇÏ¿© apply ¸¦ ¼³¸íÇÏ¿´´Ù. ÀÌÁ¦ ȯ°æÀÇ °üÁ¡¿¡¼ ¶Ç ´Ù¸¥ ¸ðµ¨À» ¼³¸íÇÑ´Ù. Apply ´Â ÇϳªÀÇ ÇÔ¼ö¿Í ±×°ÍÀÇ Àμö¿¡ ÇØ´çÇÏ´Â ½ÄµéÀÇ ¸®½ºÆ®¸¦ Àμö·Î ÃëÇÑ´Ù. °¢ ÇÔ¼ö´Â ±×°ÍÀÌ Á¤ÀÇµÈ È¯°æ°ú ¿¬°üµÇ¾î ÀÖ´Ù. ¸¹Àº °æ¿ì¿¡ ÀÖ¾î¼ ¿¬°üµÈ ȯ°æÀº ¿ÀÁ÷ Àü¿ª ȯ°æÀÌÁö¸¸, ¿¹¿ÜÀûÀÎ °æ¿ìµµ ÀÖ´Ù. Apply ´Â ÁÖ¾îÁø ÇÔ¼ö¿Í ¿¬°üµÈ ȯ°æÀ» »ç¿ëÇÏ¿© »õ·Î¿î ȯ°æÀ» ¸¸µå´Âµ¥, °Å±â¼ ±× ÇÔ¼öÀÇ Á¤ÀǸ¦ Æò°¡ÇÏ°Ô µÈ´Ù. ´ÙÀ½ Àý¿¡¼ ÇÑ È¯°æÀ¸·ÎºÎÅÍ ¾î¶»°Ô ´Ù¸¥ ȯ°æµéÀÌ »ý¼ºµÇ´Â°¡¸¦ ¸íÈ®ÇÏ°Ô ¼³¸íÇÒ °ÍÀÌ´Ù. eval °ú ¸¶Âù°¡Áö·Î apply µµ ȯ°æÀÌ ÁÖ¾îÁø´Ù.
¨ç Àμö·Î ÁÖ¾îÁø ÇÔ¼öÀÇ Á¤ÀǸ¦ ã´Â´Ù.
¨è eval À» »ç¿ëÇÏ¿© ±× ȯ°æ¿¡ ÀÖ´Â °¢ Àμö¸¦ Æò°¡ÇÑ´Ù.
¨é Á¤ÀÇ ºÎºÐ¿¡ ÀÖ´Â °¢ Çü½Ä ¸Å°³º¯¼ö°¡ Àμö ¸®½ºÆ®ÀÇ ÇØ´ç Ç׸ñÀÇ °ªÀ» °®´Â »õ·Î¿î ȯ°æÀ» »ý¼ºÇÑ´Ù. ÀÌ »õ·Î¿î ȯ°æÀº apply ¿¡ ÁÖ¾îÁø ȯ°æÀÌ ¾Æ´Ñ ÇÔ¼ö¿¡ °ü·ÃµÈ ȯ°æÀ» »ç¿ëÇÏ¿© »ý¼ºµÈ´Ù.
¨ê Eval À» »ç¿ëÇÏ¿© »õ·Î¿î ȯ°æ¿¡ ÀÖ´Â Á¤ÀÇ ºÎºÐÀ» Æò°¡ÇÑ´Ù.
eval °ú apply ¸ðµÎ Lisp ÇÁ·Î±×·¥¿¡¼ È£ÃâµÉ ¼ö ÀÖ´Â ÇÔ¼ö¶ó´Â °Í¿¡ À¯³äÇØ¾ß ÇÑ´Ù. apply ´Â ³ªÁß¿¡ ¼³¸íÇÒ °ÍÀÌ´Ù. Lisp Äڵ忡¼ eval À» »ç¿ëÇÏ´Â °ÍÀº ´ëºÎºÐÀÇ Lisp ÇÔ¼ö¿Í ¸¶Âù°¡Áö·Î eval ÀÌ ±×°ÍÀÇ Àμö¸¦ Æò°¡ÇÑ´Ù´Â »ç½Ç ¶§¹®¿¡ º¹ÀâÇØÁø´Ù. À̰ÍÀÌ ¼øÈ¯ÀûÀ¸·Î º¸ÀÎ´Ù¸é ±×°ÍÀº ½ÇÁ¦·Î ±×·¸±â ¶§¹®ÀÌ´Ù. ¾Õ¿¡¼´Â ù¹øÂ° ´Ü°èÀÇ Æò°¡°¡ ¾î¶² ½ÄÀ¸·Î ³ª¿Â °Íó·³ ±× ù¹øÂ° ´Ü°èÀÇ Æò°¡¸¦ ¹«½ÃÇϰí eval ÀÌ ¹«¾ùÀ» Çϴ°¡ ¸¸À» °í·ÁÇß´Ù. °ÅÀÇ »ç¿ëÇÒ ÇÊ¿ä´Â ¾øÁö¸¸ ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ ¶§¿¡ Ȥ½Ã eval À» »ç¿ëÇϰíÀÚ Çϸé ÁÖÀÇÇϱ⠹ٶõ´Ù.
ÇϳªÀÇ È¯°æÀº ±âÈ£ÀÇ °ªÀ» À§ÇÑ ÀúÀå¼Ò (storage) ¸¦ ÇÒ´çÇÑ´Ù. Àü¿ª Å×À̺íÀº ´ÜÁö ÇϳªÀÇ Ä¿´Ù¶õ Å×À̺í·Î »ý°¢ÇÒ ¼ö ÀÖ´Ù. »õ·Î¿î ±âÈ£¸¦ setq ÇÒ ¶§¸¶´Ù ±× ±âÈ£ÀÇ °ªÀ» °¡¸®Å°´Â Àü¿ª ȯ°æ¿¡¼ ¸Þ¸ð¸®°¡ ÀâÈù´Ù. ÇÔ¼ö¸¦ Àû¿ëÇÏ´Â µ¿¾È°ú ¾î¶² Ư¼ö Çü½ÄÀ» Æò°¡ÇÒ ¶§¿¡ »ý¼ºµÈ ȯ°æÀº º¸´Ù º¹ÀâÇÑ ±¸Á¶¸¦ °®´Â´Ù. ÀϹÝÀûÀ¸·Î ÇϳªÀÇ È¯°æÀº Å×À̺íÀÇ ¿¬°á ¸®½ºÆ® (linked list) ÀÌ´Ù. »õ·Î¿î ȯ°æÀº ±âÁ¸ÀÇ È¯°æÀ¸·ÎºÎÅÍ »ý¼ºµÇ´Âµ¥, À̶§ »õ·Î¿î Å×À̺íÀ» »ý¼ºÇÏ°í ±×°ÍÀÌ ±âÁ¸ÀÇ ºÎ¸ð ȯ°æÀ» °¡¸®Å°µµ·Ï ÇÑ´Ù. ÇÔ¼ö Á¤ÀÇÀÇ °æ¿ì¿¡ Çü½Ä ¸Å°³º¯¼ö¸¦ À§ÇÏ¿© Å×ÀÌºí¿¡ °ø°£ÀÌ ¸¶·ÃµÈ´Ù. ȯ°æ ¾È¿¡¼ ±âÈ£ÀÇ °ªÀ» °áÁ¤Çϱâ À§ÇÏ¿© eval Àº ¿ì¼± ȯ°æÀÌ °¡¸®Å°´Â Å×À̺íÀ» Á¶»çÇØ º»´Ù. ±× Å×ÀÌºí¿¡ ±âÈ£¿¡ ´ëÇÑ µî·ÏÀÌ ¾øÀ¸¸é, eval Àº ºÎ¸ð ȯ°æÀ» µé¿©´Ùº¸°í °è¼ÓÇØ¼ Àü¿ª ȯ°æ¿¡ µµ´ÞÇÒ ¶§±îÁö °è¼ÓÇÏ°Ô µÈ´Ù. ´ç½ÅÀº Àü¿ª ȯ°æÀÇ °ªÀ» ¹Ù²ÙÁö ¾Ê°í ÇÑ È¯°æ¿¡ ÀÖ´Â ±âÈ£ÀÇ Áö¿ª°ª (local value) À» ¹Ù²Ü ¼ö ÀÖ´Ù.
> (setq x 2)
2
>
(defun local (x)
(setq x (+
x 1))
(* x x))
LOCAL
> (local (+ x 1))
16
> x
2
±×¸² 5 ÇÔ¼ö È£Ãâ µ¿¾È¿¡ »ý¼ºµÈ ȯ°æµé
±×¸² 5 ´Â (local (+ x 1)) ÀÇ ¼öÇà µ¿¾È¿¡ °¢ ´Ü°è¿¡¼ ³ªÅ¸³ª´Â ȯ°æÀ» º¸¿©ÁÖ°í ÀÖ´Ù. ÀϹÝÀûÀ¸·Î ÀÌ·¸°Ô ÇÏ´Â Áß¿äÇÑ ÀÌÀ¯ ÁßÀÇ Çϳª´Â, Àü¿ª º¯¼öµéÀº ±ä Äڵ忡¼ ÃßÀûÇϱⰡ ¾î·Æ´Ù´Â °ÍÀÌ´Ù. ³Î¸® Èð¾îÁ® ÀÖ´Â Àü¿ª º¯¼öµéÀº Å« ÇÁ·Î±×·¥À» ÀÌÇØÇÏ±â ¾î·Æ°Ô ¸¸µç´Ù.
> (defun global
(x)
(setq sym (+ x 1))
(* sym sym))
GLOBAL
>
(global 1)
4
> sym
2
Áö¿ª º¯¼ö (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) ÇÔ¼öÀÇ Á¤ÀǸ¦ ÀÌ¿ëÇØ¼ Áö¿ª º¯¼ö¸¦ ÁöÁ¤ÇÏ´Â µÎ °¡Áö ¹æ¹ýÀ» ¼³¸íÇÑ´Ù.
> (defun interpolate
(x1 y1 x2 y2 x3)
(if (= x1
x2)
y1
(let
((m (/ (- y2 y1) (- x2 x1)))
(b
y1)
(x
(- x3 x1)))
(+
(* m x) b))))
INTERPOLATE
> (interpolate 1 1 5 5 4)
4
>
(interpolate 1 3 4 3 2)
3
0 À¸·Î ³ª´©´Â °ÍÀ» ÇÇÇϱâ À§Çؼ if ¹®À» »ç¿ëÇÏ¿´´Ù.
´ÙÀ½ ÇÔ¼ö´Â let À» »ç¿ëÇÏ´Â ´Ù¸¥ ¿¹¸¦ º¸¿©Áִµ¥ ÀÌ °æ¿ì´Â cond ¹®À» »ç¿ëÇÑ´Ù. Read ´Â Àμö°¡ ¾øÀÌ Ç¥ÁØ ÀÔ·Â (ÁÖ·Î Å͹̳Î) À¸·ÎºÎÅÍ ÇϳªÀÇ ½ÄÀ» Àд ÇÔ¼öÀ̰í, random Àº ¾ç¼ö n ¿¡ ÇØ´çÇÏ´Â ÇϳªÀÇ Àμö¸¦ ÃëÇϰí, 0 ¿¡¼ n »çÀÌ (À̶§ 0 Àº Æ÷ÇԵdzª n Àº Æ÷ÇÔµÇÁö ¾ÊÀ½) ÀÇ °°Àº ÇüÀÇ ¼ö (ÀÌ °æ¿ì¿¡´Â Á¤¼ö) ¸¦ ¸®ÅÏÇÏ´Â ÇÔ¼öÀÌ´Ù. n ÀÌ Á¤¼öÀÎ °æ¿ì¿¡ °¡´ÉÇÑ °á°úµéÀº ´ë·«ÀûÀ¸·Î 1/n ÀÇ ºóµµ·Î ³ªÅ¸³´Ù.
> (defun guess
()
(princ "Guess an integer
from 0 to 9: ")
(let
((response (read)) (number (random 10)))
(cond
((> response number) (princ "Too high!"))
((<
response number) (princ "Too low!"))
(t
(princ "Lucky guess!")))))
GUESS
> (guess)
Guess an
integer from 0 to 9: 3
Too low!
3 Àº ÇÁ·ÒÇÁÆ® (prompt) ¿¡ ´ëÀÀÇØ¼ »ç¿ëÀÚ°¡ ÀÔ·ÂÇÑ °ÍÀÌ´Ù.
±×¸² 6 ÁßøµÈ let ¹®À» »ç¿ëÇÏ¿© »ý¼ºµÈ ȯ°æµé
¿ì¸®´Â let ¹®À» ¿©·¯ °³ ÁßøÇÔÀ¸·Î½á º¸´Ù º¹ÀâÇÑ ±¸Á¶ÀÇ È¯°æÀ» ¸¸µé ¼ö ÀÖ´Ù. ÇϳªÀÇ È¯°æÀ» ÅëÇØ¼ µµÀÔµÈ º¯¼öÀÇ À¯È¿¹üÀ§ (scope) ´Â let ¶Ç´Â defun ¿¡¼ Á¤ÀÇµÈ °ýÈ£ÀÇ ¹üÀ§¿¡ ÀÇÇØ¼ °áÁ¤µÈ´Ù. ÀÌ·¯ÇÑ ÀÌÀ¯·Î ±×·± º¯¼öµéÀ» °¡²û »çÀüÀû ¶Ç´Â Á¤Àû (static) º¯¼ö·Î ºÎ¸£°í, ±×°ÍµéÀÇ À¯È¿¹üÀ§¸¦ °áÁ¤ÇÏ´Â ±ÔÄ¢À» »çÀüÀû À¯È¿¹üÀ§ (lexical scoping) ¶ó°í ºÎ¸¥´Ù. ¸¹Àº Lisp º¯ÇüµéÀº À¯È¿¹üÀ§°¡ Æò°¡ ½Ã°£¿¡ °áÁ¤µÇ´Â µ¿Àû (dynamic) º¯¼ö¸¦ Áö¿øÇÑ´Ù. »çÀüÀûÀ¸·Î À¯È¿¹üÀ§°¡ °áÁ¤µÈ º¯¼ö¿¡ ÀüÀûÀ¸·Î ÀÇÁ¸ÇÏ´Â ÄÚµå´Â ÇÁ·Î±×·¡¸Ó°¡ º¸´Ù ÀÌÇØÇϱ⠽±°í ÄÄÆÄÀÏ·¯°¡ È¿À²ÀûÀÎ Äڵ带 »ý¼ºÇÑ´Ù´Â ÀåÁ¡À» °¡Áö°í ÀÖ´Ù. º¯¼ö´Â Àü¿ªÀû (global) À̰ųª Áö¿ªÀû (local) À̰í, Áö¿ªÀûÀÎ °æ¿ì¿¡´Â »çÀüÀû À¯È¿¹üÀ§ °áÁ¤ ¹æ¹ýÀ» ÃëÇÑ´Ù.
´ÙÀ½ÀÇ Äڵ忡¼ Lisp ÀÇ ÇÁ¸°Æ® ÇÔ¼öÀÎ princ ¸¦ »ç¿ëÇÏ¿© º¯¼öÀÇ »çÀüÀû À¯È¿¹üÀ§ °áÁ¤À» ¼³¸íÇÑ´Ù. princ ´Â ±×°ÍÀÇ Àμö¸¦ Æò°¡Çϰí, ±× °á°ú¸¦ ÇÁ¸°Æ®Çϰí, ÇÁ¸°Æ® ¹®ÀÇ °ªÀ¸·Î ±× °á°ú¸¦ ¸®ÅÏÇÏ´Â ÇÔ¼öÀÌ´Ù.
> (let ((x
1))
(let ((x 2))
(let
((x 3))
(princ
x))
(princ x))
(princ x))
321
1
let ¹® ´ÙÀ½¿¡ ¿À´Â ù¹øÂ° ÁÙÀº ¼¼ °³ÀÇ princ ¸¦ È£ÃâÇÑ °á°úÀÌ´Ù. µÎ¹øÂ° ÁÙÀº let ¹®¿¡ ÀÇÇØ ¸®ÅÏµÈ °ªÀÌ´Ù. ±×¸² 6 Àº ÄÚµåÀÇ ½ÇÇà µ¿¾È¿¡ ´Ù¸¥ ´Ü°è¿¡¼ Á¸ÀçÇϴ ȯ°æÀ» º¸¿©ÁÖ°í ÀÖ´Ù.
Let ¹®Àº º¹ÀâÇÑ ±¸Á¶ÀÇ È¯°æÀ» ±¸ÃàÇÒ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù. ÀÌÁ¦±îÁö ¼³¸íÇÑ °ÍÀ¸·ÎºÎÅÍ ÇϳªÀÇ ÇÔ¼ö°¡ È£ÃâµÉ ¶§ Æò°¡´Â »õ·Î¿î ȯ°æ¿¡¼ ½ÃÀÛÇϸç Çü½Ä ¸Å°³º¯¼ö¸¦ ÀúÀåÇϰí Àü¿ª ȯ°æÀ» °¡¸®Å°´Â »õ·Î¿î Å×À̺íÀ» Æ÷ÇÔÇÑ´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. let ÀÌ ¾øÀ¸¸é ¸ðµç ȯ°æÀº Àü¿ª ȯ°æÀ» °¡¸®Å°´Â ÇϳªÀÇ Å×ÀÌºí¸¸À¸·Î ±¸¼ºµÉ °ÍÀÌ´Ù. ±×¸² 7 Àº Àç±ÍÇÔ¼ö¸¦ Æ÷ÇÔÇÏ´Â ÇϳªÀÇ ¿¹·Î¼, (raise 3 2) ÀÇ ½ÇÇà µ¿¾È¿¡ ´Ù¸¥ ´Ü°è¿¡ Á¸ÀçÇϴ ȯ°æµéÀ» º¸¿©ÁÖ°í ÀÖ´Ù. ´ÙÀ½ Àý¿¡¼´Â ȯ°æÀ» ÀÌ¿ëÇÏ´Â º¸´Ù º¹ÀâÇÑ ¹æ¹ý¿¡ ´ëÇØ¼ »ý°¢ÇØ º»´Ù.
ÀÌÁ¦±îÁö ¼Ò°³ÇÑ ÇÔ¼ö¸¦ Á¤ÀÇÇÏ°í »ç¿ëÇÏ´Â ¹æ¹ýµéÀº ¾à°£ÀÇ Á¦ÇÑÀ» °¡Áö°í ÀÖ´Ù. ¿¹¸¦ µé¾î, ÇÔ¼ö´Â Àü¿ª º¯¼ö¸¦ Á¦¿ÜÇϰí´Â ÀÌÀü¿¡ È£ÃâµÈ °ªÀ» ´Ù½Ã ºÒ·¯³¾ ¼ö ¾ø´Ù. ¸ðµç ÇÔ¼ö´Â À̸§À» °¡Á®¾ß ÇÑ´Ù. ÇÔ¼ö´Â »õ·Î¿î ÇÔ¼ö¸¦ »ý¼ºÇϰųª, Àμö·Î ÇÔ¼ö¸¦ Àü´ÞÇϰųª, defun À¸·Î Á¤ÀǵÇÁö ¾ÊÀº ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ¾ø´Ù. ÀÌ Àý¿¡¼´Â ÀÌ·¯ÇÑ Á¦ÇÑÀ» ¾î¶»°Ô ±Øº¹ÇÒ ¼ö ÀÖ´ÂÁö¸¦ ¼³¸íÇÑ´Ù.
ÀÚ·á ¶Ç´Â »óÅ (state) ¸¦ ÇϳªÀÇ Æ¯Á¤ ÇÔ¼ö ¶Ç´Â ¿©·¯ ÇÔ¼ö·Î ¿¬°ü½ÃŰ´Â °ÍÀÌ Á¾Á¾ À¯¿ëÇÒ ¶§°¡ ÀÖ´Ù. ÀÌ·¸°Ô Çϱâ À§ÇÑ ¹æ¹ýÀº ´Ù¼öÀÇ Àü¿ª º¯¼ö¸¦ »ý¼ºÇϰí Àû´çÇÑ °ªÀ¸·Î setq ÇÏ´Â °ÍÀÌ´Ù. ±×·¯³ª ¾Õ¿¡¼ ÁöÀûÇßµíÀÌ ÀÌ·¸°Ô Àü¿ª º¯¼ö¸¦ ÀÌ¿ëÇϸé ÇÁ·Î±×·¥À» ÀÌÇØÇϱâ Èûµé¾îÁø´Ù. ´Ù¸¥ ¹æ¹ýÀº Áö¿ª»óÅ (local state) ¸¦ ÂüÁ¶Çϴ ȯ°æ¿¡ Áö¿ª º¯¼ö¸¦ »ç¿ëÇÏ´Â ÇÔ¼öµéÀ» ÁßøÇÏ´Â ÇüÅ·Πȯ°æÀ» »ý¼ºÇÏ´Â °ÍÀÌ´Ù.
ÇϳªÀÇ È¯°æÀÌ Á¸ÀçÇØ ÀÖ´Â µ¿¾ÈÀ» ±×°ÍÀÇ À¯È¿±â°£ (extent) À̶ó°í ºÎ¸¥´Ù. ÀÌÁ¦±îÁö ¿ì¸®°¡ ¾ð±ÞÇØ¿Ô´ø ȯ°æÀÇ À¯È¿±â°£Àº ´ÜÁö ÇϳªÀÇ ÇÁ·Î½ÃÀú¸¦ ½ÇÇàÇϴµ¥ °É¸®´Â ½Ã°£ÀÌ´Ù. ÇÑ °¡Áö ÁÖ¸ñÇØ¾ß ÇÒ ¿¹¿Ü°¡ ÀÖ´Ù. Àü¿ª ȯ°æÀÇ À¯È¿±â°£Àº Lisp ÇÁ·Î¼¼½º°¡ ½ÇÇàµÇ°í ÀÖ´Â Àüü ½Ã°£ÀÌ´Ù. ±âÈ£¿Í ¿¬°üµÈ Lisp °´Ã¼°¡ »ý¼ºµÉ ¶§¸¶´Ù ±× °´Ã¼´Â ±×°ÍÀÇ È¯°æÀ» °¡¸®Å°´Â Æ÷ÀÎÅ͸¦ À¯ÁöÇÏ¿© ±× ȯ°æÀÌ ÂüÁ¶ÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù. ±× °´Ã¼°¡ Á¸ÀçÇÏ´Â ÇÑ ±×°Í°ú ¿¬°üµÈ ȯ°æÀº °è¼Ó Á¸ÀçÇÏ°Ô µÈ´Ù. ÀÌÁ¦±îÁö ¿ì¸®°¡ »ìÆìº» Lisp °´Ã¼ Áß¿¡¼ º¯¼ö¸¦ ÂüÁ¶ÇÒ ¼ö ÀÖ´Â °´Ã¼´Â ´ÜÁö ÇÔ¼öµé»ÓÀ̾úÀ¸³ª °ð ±×·¯ÇÑ ´Ù¸¥ °´Ã¼¸¦ ¾î¶»°Ô »ý¼ºÇÏ´ÂÁö¸¦ ¹è¿ï °ÍÀÌ´Ù.
ÀÌÁ¦±îÁö °í·ÁÇØ ¿Ô´ø ¸ðµç ÇÔ¼öµéÀº ±×°Í°ú °ü·ÃµÈ ȯ°æÀ¸·Î Àü¿ª ȯ°æÀ» °¡Áö°í ÀÖÀ¸³ª ´Ù¸¥ ȯ°æÀ¸·Îµµ ½±°Ô ÇÔ¼ö¸¦ Á¤ÀÇÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½ÀÇ squrelast ¶ó´Â ÇÔ¼ö´Â ¸¶Áö¸·À¸·Î »ç¿ëÇÑ Àμö¿¡ ÇØ´çÇÏ´Â ¼ýÀÚ¸¦ ±â¾ïÇϱâ À§ÇØ Áö¿ª»óŸ¦ »ç¿ëÇÏ°í ±× ¼ýÀÚÀÇ Á¦°ö°ªÀ» ¸®ÅÏÇÑ´Ù. Squarelast ´Â »ç¿ëÀÚ°¡ »ç¿ëÇϱ⠹ٷΠÀÌÀü ´Ü°èÀÇ ´äÀ» ³½´Ù.
> (let (x (y
1))
(defun squarelast (z)
(setq
x y) (setq y x) (* x x)))
SQUARELAST
> (squarelast 2)
1
>
(squarelast 3)
4
±×¸² 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 À» ¼³¸íÇÏ´Â °£´ÜÇÑ ¿¹°¡ ÀÖ´Ù.
> (funcall
#'(lambda (x) (* x x)) 3)
9
À̸§À» °¡Áø ÇÔ¼ö¿Í lambda ÇÔ¼ö´Â ¸ðµÎ Á¾Á¾ º¯¼ö·Î Àü´ÞµÇ°Å³ª funcall ÀÇ Àμö·Î Àü´ÞµÇ±â À§ÇØ ¸®½ºÆ® ¾È¿¡ ÀÖ°Ô µÈ´Ù.
> (defun decreasingp
(x y f)
(if (> (funcall f x)
(funcall f y)) t nill))
DECREASINGP
> (decreasingp 1 2 #'(lambda
(x) (* x x )))
NIL
> (setq reciprocal #/(lambda (x)
(/ 1 x)))
#<Interpreted-Function (LAMBDA (x) (/ 1 x)) 104BB75>
>
(decreasingp 1 2 reciprocal)
T
Lambda ÇÔ¼öµµ ¿¬°üµÇ¾î ÀÖ´Â »óÅ (associated state) ¸¦ °¡Áú ¼ö ÀÖ´Ù.
> (let ((x 0))
(setq counter #'(lambda () (setq x (+ x
1)))))
#<Interpreted-function (LAMBDA () (SETQ X (+ X 1))) 104BB76>
>
(funcall counter)
1
> (funcall counter)
2
¸¸ÀÏ counter ¶ó´Â ±âÈ£¿¡ »õ·Î¿î ¾î¶² °ÍÀ» ÇÒ´çÇÑ´Ù¸é, »ý¼ºµÇ¾ú´ø ȯ°æÀº À¯È¿±â°£ÀÌ ³¡ÀÌ ³ª¼ ´õ ÀÌ»ó Á¸ÀçÇÏÁö ¾Ê°Ô µÈ´Ù.
ÀÌÁ¦±îÁö ¸®½ºÆ®´Â ÇÁ·Î±×·¥À» À§ÇÑ Ç¥ÇöÀ¸·Î¼¸¸ »ç¿ëÇß´Ù. Lisp ¿¡¼´Â ÇÁ·Î±×·¥°ú ÀÚ·á (data) ¸ðµÎ ¸®½ºÆ®·Î ³ªÅ¸³¯ ¼ö ÀÖ´Ù. ¿ì¸®´Â Ãß»óÀû ÀÚ·áÇü (abstract data type) À» ±¸ÃàÇϰí Lisp ÀúÀå¼ÒÀÇ Ãß»óȸ¦ À§ÇØ ¸®½ºÆ®¸¦ »ç¿ëÇÑ´Ù.
¸ð¼øÀûÀ¸·Î µé¸±Áö´Â ¸ð¸£°ÚÁö¸¸ ±âÈ£ Á¶ÀÛÀÇ ¸ñÀûÀ» À§Çؼ ±âÈ£´Â °ªÀ» °®Áö ¾Ê¾Æµµ µÈ´Ù. ÇϳªÀÇ ±âÈ£¸¦ ÂüÁ¶Çϱâ À§ÇØ (±×°ÍÀÇ °ªÀ» ÂüÁ¶ÇÏ´Â °ÍÀÌ ¾Æ´Ô) eval ÀÌ Æò°¡¸¦ ÁßÁöÇϵµ·Ï ÇÏ´Â °ÍÀÌ Á¾Á¾ À¯¿ëÇÒ ¶§°¡ ÀÖ´Ù. À̰ÍÀº Lisp ¿¡¼ quote ÇÔ¼ö·Î ÀÌ·ç¾îÁø´Ù. Quote ¹®Àº Lisp ÇÁ·Î±×·¥¿¡¼ ¸Å¿ì ÀÚÁÖ ¾²À̱⠶§¹®¿¡ Æí¸®ÇÑ »ý·«ÇüÀÌ ÀÖ´Ù. 'expression Àº (quote expression) ÀÇ »ý·«ÇüÀÌ´Ù. quote ´Â ¾î¶² ½ÄÀÌ¶óµµ eval ·Î ÇÏ¿©±Ý ±×°ÍÀÇ Æò°¡¸¦ ÁßÁöÇϵµ·Ï ÇÑ´Ù.
> (quote sym)
SYM
>
'sym
SYM
> '(first second third)
(FIRST SECOND THIRD)
±âÈ£µéÀÌ ¾î¶² °ÍÀÎÁö ¹Ì¸® ¾Ë°í ÀÖ´Ù¸é quote ¸¦ »ç¿ëÇÏ¿© ±× ±âÈ£µéÀÇ ¸®½ºÆ®¸¦ ¸¸µé ¼ö ÀÖ´Ù. ¶ÇÇÑ list ¸¦ »ç¿ëÇÏ¿© ÇÁ·Î±×·¥ ½ÇÇà Áß¿¡ º¸´Ù À¶Å뼺 ÀÖ°Ô ¸®½ºÆ®µéÀ» ¸¸µé ¼ö ÀÖ´Ù.
list ¶ó´Â ÇÔ¼ö´Â ¸®½ºÆ®¸¦ ¸¸µå´Â Æí¸®ÇÑ ¹æ¹ýÀ» Á¦°øÇÑ´Ù. list ´Â ÀÓÀÇÀÇ °³¼öÀÇ Àμö¸¦ ÃëÇØ¼ ±× °ªµéÀÇ ¸®½ºÆ®¸¦ ¸®ÅÏÇÑ´Ù.
> (list 1 2
3 4)
(1 2 3 4)
> (list 1 (list 2 (list 3)))
(1 (2 (3)))
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) ÀÌ·± ½ÄÀ¸·Î °è¼ÓµÈ´Ù.
> (setq four
(list 2 3 4))
(1 2 3 4)
> (list (first four) (second four)
(nth 2 four))
(1 2 3)
> (rest four)
(2 3 4)
¿ì¸®´Â first ¿Í rest ¸¦ ÀÌ¿ëÇÏ¿© ¸®½ºÆ®¸¦ ºÐ¸®ÇÒ ¼ö ÀÖ°í, µÎ °³ÀÇ Àμö¸¦ °®´Â cons (constructor ¿¡¼ À¯·¡) ¸¦ ½á¼ ´Ù½Ã ÇÕÄ¥ ¼ö ÀÖ´Ù.
> (setq first
1)
1
> (setq rest (list 2 3 4))
(2 3 4)
> (cons first
rest)
(1 2 3 4)
´ëºÎºÐÀÇ °æ¿ì¿¡ ÀÖ¾î cons ÀÇ µÎ¹øÂ° Àμö´Â ¸®½ºÆ®Áö¸¸, ¹Ýµå½Ã ±×·² ÇÊ¿ä´Â ¾ø´Ù.
Cons ´Â Á¡À¸·Î ¿¬°áµÈ ½Ö (dotted pair) À» ¸¸µå´Âµ¥, ±× ÀÌÀ¯´Â °ð ¾Ë°Ô µÉ °ÍÀÌ´Ù. ±×°ÍÀº µÎ ÀμöÀÇ °ªÀ» ÂüÁ¶ÇÏ´Â µÎ °³ÀÇ Æ÷ÀÎÅ͸¦ À§ÇÑ ÀúÀå¼Ò¸¦ ÇÒ´çÇÑ´Ù.
> (setq x (cons
1 2))
(1. 2)
> (setq y (cons 1 (cons 2 ())))
(1 2)
Á¡À¸·Î ¿¬°áµÈ ½Ö¿¡ ´ëÀÀÇÏ´Â ¸Þ¸ð¸®ÀÇ ±¸Á¶´Â Äܽº¼¿ (cons cell) À̶ó°í ºÒ¸®¿ì°í Æ÷ÀÎÅ͸¦ °¡Áø ¸ÂºÙ¿©Áø ³×¸ðÀÇ ±×¸²À¸·Î ¹¦»çµÈ´Ù. ±×¸² 8 Àº ¾ÕÀÇ ½ÄÀ» Æò°¡ÇÔÀ¸·Î½á ¾òÀº ±¸Á¶¸¦ º¸¿©ÁÖ°í ÀÖ´Ù.
Lisp ¿¡ ´ëÇÑ ´Ù¸¥ Ã¥À» ÀÐÀ» ¶§ car ¿Í cdr À̶õ ÇÔ¼ö¸¦ º¸°Ô µÉÁöµµ ¸ð¸¥´Ù. First ¿Í rest °¡ car ¿Í cdr º¸´Ù ´õ ÆíÇÏ°í ±â¾ïÇϱ⠽¬¿î À̸§ÀÌ´Ù. car ¿Í cdr ÀÇ À̸§Àº Lisp °¡ óÀ½ ¼³°èµÇ¾î ¿î¿ëµÉ ¶§¿¡ ÄÄÇ»ÅÍÀÇ ±â°è ±¸Á¶·Î »ý°Ü³µ´Ù.
> (car x)
1
>
(cdr y)
(2)
> (car (cdr y))
2
±×¸² 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 ´Â ù¹øÂ° Àμö¸¦ ÆÄ±«ÀûÀ¸·Î º¯°æÇÑ´Ù.
> (setq x (list
1 (list 2)))
(1 (2))
> (self (first (first (rest x))) 1)
1
>
x
(1 (1))
Self ´Â setq º¸´Ù ´õ ÀϹÝÀûÀÌÁö¸¸ setq ´Â ¾ÆÁ÷µµ ±âÈ£°¡ º¹ÀâÇÑ ¸Þ¸ð¸® º¯°æÀÌ ¾Æ´Ï¶ó ±×³É °ªÀ» ÁöÁ¤ÇÏ´Â °ÍÀ̶ó´Â °ÍÀ» ³ªÅ¸³»´Â ¹®¼ÈÀÇ ¸ñÀûÀ¸·Î ¾²À̰í ÀÖ´Ù. self ´Â ºÎÁÖÀÇÇÏ°Ô »ç¿ëµÇ¸é °¡²û ÇÁ·Î±×·¥¿¡¼ ¹Î°¨ÇÑ ¿À·ù¸¦ À¯¹ßÇÒ ¼ö Àֱ⠶§¹®¿¡ ÁÖÀÇÇØ¾ß ÇÑ´Ù. Self ´Â Ç¥Çö»óÀÇ ¸ñÀûÀ¸·Î À¯¿ëÇÑ ¼øÈ¯ÀûÀÎ ¸®½ºÆ® ±¸Á¶¸¦ ¸¸µé ¼ö ÀÖ°Ô ÇØÁØ´Ù. ±×·¯³ª, ±×·¯ÇÑ ±¸Á¶¸¦ ÇÁ¸°Æ®ÇÒ ¶§¿¡´Â Á¶½ÉÇÏÁö ¾ÊÀ¸¸é ¾ÈµÈ´Ù.
> (self (first
(rest x)) x)
(1 (1 (1 (1 (1 (1 (1 (1 (1 (1 (1 ...
ÀÌ È£Ãâ¿¡ ÀÇÇÑ ÇØ¼®±âÀÇ ½ÇÇàÀº ÁߴܵǾî¾ß ÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸é ³¡¾øÀÌ ÇÁ¸°ÆÃÀ» °è¼ÓÇÒ °ÍÀÌ´Ù. ±×¸² 9 ´Â °á°ú·Î ³ª¿Â ±¸Á¶¸¦ ±×¸²À¸·Î º¸¿©ÁÖ°í ÀÖ´Ù. Common Lisp ´Â ¼øÈ¯ÀûÀÎ ¸®½ºÆ® ±¸Á¶¸¦ ¾Ë¸Â°Ô Ãâ·ÂÇϱâ À§ÇÑ ÇÁ·Î½ÃÀú¸¦ Æ÷ÇÔÇϰí ÀÖ´Ù.
±×¸² 9 ¸Þ¸ð¸® »óÀÇ ¸®½ºÆ® ±¸Á¶ÀÇ º¯°æ
ÇØ¼®±â¿ÍÀÇ ´ÙÀ½ ´ëÈ¿¡¼ ¼³¸íµÇµíÀÌ Lisp ´Â °ª¿¡ ÀÇÇÑ È£Ãâ (call-by-value) ·Î Àμö¸¦ Àü´ÞÇÑ´Ù.
> (defun foo
(x) (setq x 0))
FOO
> (let ((x 1)) (foo x) (princ x))
1
¿ì¸®´Â Æ÷ÀÎÅÍ¿Í self ¸¦ »ç¿ëÇÏ¿© ´Ù¸¥ Àμö Àü´Þ ¹æ¹ýµéÀ» Èä³»³¾ ¼ö ÀÖ´Ù. ´ÙÀ½Àº ÂüÁ¶¿¡ ÀÇÇÑ È£Ãâ (call-by-reference) ¹æ½ÄÀ» Èä³»³»´Â ¹æ¹ýÀ» ¼³¸íÇÑ´Ù.
> (defun bar
(x) (self (first x) 0))
BAR
> (let ((x (list 1))) (bar x) (princ
(first x)))
0
±×·¯³ª Lisp ¿¡´Â ±âÈ£¸¦ ÂüÁ¶¿¡ ÀÇÇÑ È£ÃâÀ» ÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀº ¾ø´Ù.
Lisp ´Â ¸®½ºÆ®¿¡ ´ëÇÑ Å×½ºÆ®¸¦ ¼öÇàÇϱâ À§ÇÑ ´Ù¾çÇÑ ºÎ¿ï ¼ú¾î (boolean predicate) ¸¦ °¡Áö°í ÀÖ´Ù. listp ´Â ¸®½ºÆ®¿¡ ´ëÇØ¼, consp ´Â Á¡À¸·Î ¿¬°áµÈ ¦µé (dotted pair) ¿¡ ´ëÇØ¼, null Àº °ø¹é ¸®½ºÆ® nil ¶Ç´Â ( ) ¿¡ ´ëÇØ¼ Å×½ºÆ®¸¦ ÇÑ´Ù. ¸®½ºÆ®ÀÇ ±¸Á¶¸¦ ºñ±³Çϱâ À§ÇÑ °ÍÀ¸·Î eq ¿Í equal ÀÌ ÀÖ´Ù. eq ´Â µÎ °³ÀÇ Àμö°¡ ¸Þ¸ð¸®»óÀÇ °°Àº À§Ä¡¸¦ °¡¸®Å°´Â°¡¸¦ °áÁ¤ÇÑ´Ù. Nil °ú ( ) ´Â eq ÀÌ´Ù. Equal Àº µÎ °³ÀÇ Àμö°¡ ±¸Á¶ÀûÀ¸·Î ºñ½ÁÇѰ¡¸¦ °áÁ¤ÇÑ´Ù.
> (setq sym
'foo)
FOO
> (eq sym 'foo)
T
> (setq sym (list 'foo)
(FOO)
>
(eq sym (list 'foo))
NIL
> (setq new sym)
(FOO)
> (eq
new sym)
T
> (equal sym (list 'foo))
T
¸®½ºÆ®¸¦ ´Ù·ç´Â ÇÔ¼öµé Áß¿¡¼ append ´Â ¸®½ºÆ®·Î Æò°¡µÇ´Â 0 °³ ÀÌ»óÀÇ Àμö¸¦ ÃëÇØ¼ ±×µé ¸®½ºÆ® ¾È¿¡ ÀÖ´Â ¸ðµç ¿ø¼Ò·Î ÀÌ·ç¾îÁø »õ·Î¿î ¸®½ºÆ®¸¦ ¸®ÅÏÇÑ´Ù. Nconc ´Â ¸¶Áö¸· ¿ø¼Ò¸¦ Á¦¿ÜÇÑ ¸ðµç Àμö¸¦ ÆÄ±«ÀûÀ¸·Î º¯°æÇÑ´Ù´Â Á¡À» Á¦¿ÜÇϰí´Â append ¿Í ºñ½ÁÇÏ´Ù.
> (setq x '(1
2) y '(3 4))
(3 4)
> (append x y)
(1 2 3 4)
> x
(1
2)
> (nconc x y)
(1 2 3 4)
> x
(1 2 3 4)
Reverse ´Â ÇϳªÀÇ ¸®½ºÆ®¸¦ Àμö·Î ÃëÇØ¼ ±×°ÍÀÇ ¿ª¼øÀ¸·Î ¹è¿µÈ ¿ø¼Òµé·Î ÀÌ·ç¾îÁø »õ·Î¿î ¸®½ºÆ®¸¦ ¸®ÅÏÇÑ´Ù. member ´Â ÀÓÀÇÀÇ Lisp °´Ã¼¿Í ¸®½ºÆ®¿¡ ÇØ´çÇÏ´Â µÎ °³ÀÇ Àμö¸¦ ÃëÇÏ´Â ¸Å¿ì À¯¿ëÇÑ Lisp ÇÔ¼öÀÌ´Ù. ù¹øÂ° Àμö¿¡ ÇØ´çÇÏ´Â °´Ã¼°¡ µÎ¹øÂ°¿¡ ÇØ´çÇÏ´Â ¸®½ºÆ®ÀÇ ¿ø¼ÒÀ̸é member ´Â ±× ¸®½ºÆ®¿¡¼ °´Ã¼¿Í eq °ü°èÀΠù¹øÂ° ¿ø¼Ò·ÎºÎÅÍ ½ÃÀÛÇÏ´Â ¸®½ºÆ® (²¿¸®¿¡ ÇØ´çÇÏ´Â) ¸¦ ¸®ÅÏÇÑ´Ù. ¸¸ÀÏ ±× °´Ã¼°¡ ¸®½ºÆ®ÀÇ ¿ø¼Ò°¡ ¾Æ´Ï¸é member ´Â nil À» ¸®ÅÏÇÑ´Ù.
> (member 5
(append '(1 2 3) '(4 5) '(6 7 8)))
(5 6 7 8)
Common Lisp ÀÇ ¸¹Àº ÇÔ¼öµéÀº Ű¿öµå·Î ³¢¿ö ³ÖÀ» ¼ö ÀÖ´Â ÇÔ¼ö¸¦ ¼±Åà »ç¾çÀÇ Àμö·Î ÃëÇϰí ÀÖ´Ù. Ű¿öµå´Â ù¹øÂ° ¹®ÀÚ°¡ ÄÝ·Ð (¿¹¸¦ µé¾î, :test) ÀÎ ±âÈ£·Î¼ Àμö ¸®½ºÆ®¿¡ ³ªÅ¸³´Ù. ¿¹¸¦ µé¾î, ¾Õ¿¡¼ member ´Â ¸®½ºÆ®¿¡ ÀÖ´Â °´Ã¼¸¦ Å×½ºÆ®Çϱâ À§Çؼ eq ¸¦ ¾´´Ù°í Çß´Ù. ¸¸ÀÏ (member x l) À̶ó°í ¾²´Â ´ë½Å¿¡ (member x l :test #'equal) À̶ó°í ¾´´Ù¸é, member ´Â eq ´ë½Å¿¡ equal ¸¦ »ç¿ëÇÏ¿© Å×½ºÆ®¸¦ ÇÒ °ÍÀÌ´Ù. ¶ÇÇÑ Å×½ºÆ® ¹æ¹ýÀ¸·Î¼ lambda ÇÔ¼ö¸¦ ¼¼úÇÒ ¼öµµ ÀÖ´Ù.
> (member '(2)
'((1) (2) (3)))
NIL
> (member '(2) '((1) (2) (3)) :test #'equal)
((2)
(3))
> (member '(1 2) '((0 4) (1 3))
:test
#'(lambda (x y) (eq (first x)
(first
y))))
((1 3))
»õ·Î¿î ¸®½ºÆ® ó¸® ¹æ¹ýÀ» »ç¿ëÇÏ¿© ÀÌÁ¦ ÇϳªÀÇ ¼ýÀÚ½Ö (¿¹¸¦ µé¾î, (1 2)) °ú ¼ýÀÚ ½ÖÀÇ ¸®½ºÆ® (¿¹¸¦ µé¾î, ((1 2) (2 4) (4 8))) ÀÇ µÎ °³ÀÇ Àμö¸¦ °¡Áø insert ¶ó´Â ÇÔ¼ö¸¦ Á¤ÀÇÇÑ´Ù. ½ÖÀÇ ¸®½ºÆ®´Â °¢ ½ÖÀÇ Ã¹¹øÂ° ¿ø¼ÒÀÇ Å©±â¿¡ ÀÇÇØ¼ ÀÛÀº ¼ö°¡ ¾Õ¿¡ ¿Àµµ·Ï Á¤·ÄµÇ¾î ÀÖ´Ù°í ÇÏÀÚ. ¼ýÀÚ½ÖÀÇ ¸®½ºÆ®´Â x ¿Í f(x) ÀÇ ¼ýÀÚ½ÖÀÇ ÇüŸ¦ °¡Áø »ùÇÃÀ» Ç¥ÇöÇÑ´Ù. ¿©±â¼ f(x) ´Â ÇϳªÀÇ º¯¼ö¸¦ °®´Â ½ºÄ®¶ó (scalar) ÇÔ¼öÀÌ´Ù. ù¹øÂ° ¿ø¼Ò°¡ °°Àº µÎ ½ÖÀ» ¸®½ºÆ®¿¡ Æ÷ÇÔÇÒ ÇÊ¿ä´Â ¾ø´Ù. ±× ½ÖµéÀÌ °°Àº ÇÔ¼ö¿¡¼ ¿Â °ÍÀÌ°í µÎ ½ÖÀÇ Ã¹¹øÂ° ¿ø¼Ò°¡ °°´Ù¸é (=), µÎ¹øÂ° ¿ø¼Òµéµµ ¿ª½Ã °°°í µÎ ½ÖÀº equal ÀÏ °ÍÀÌ´Ù. Insert ´Â ù¹øÂ° ÀμöÀÇ ½ÖÀ» »õ·Î Æ÷ÇÔÇÏ´Â Á¤·ÄµÈ ¸®½ºÆ®¸¦ »ý¼ºÇÑ´Ù. À̰ÍÀº first ¿Í rest ·Î ¸®½ºÆ®¸¦ ºÐ¸®Çϰí, ÇÊ¿äÇÑ °÷¿¡ »õ·Î¿î ½ÖÀ» »ðÀÔÇϰí, ´Ù½Ã cons ·Î ÀÌÀ½À¸·Î½á ¸¸µé°Ô µÈ´Ù.
> (defun insert
(new pairs)
(cond ((null pairs)
(cons new ()))
((=
(first new) (first (first pairs))) pairs)
((<
(first new) (first (first pairs))) (cons new pairs))
(t
(cons (first pairs) (insert new (rest pairs))))))
INSERT
> (insert
'(3 4) '((1 2) (2 4) (5 6)))
((1 2) (2 4) (3 4) (5 6))
> (insert
'(1 2) (insert '(3 4) ()))
((1 2) (3 4))
Insert ´Â µÎ¹øÂ°ÀÇ Àμö¿¡ ÇØ´çÇÏ´Â ¸®½ºÆ®°¡ nil ÀÏ ¶§±îÁö ±× ¸®½ºÆ®ÀÇ rest ¿¡ ÀÚ±â ÀÚ½ÅÀ» Àç±ÍÀûÀ¸·Î Àû¿ëÇÑ´Ù. º¹ÀâÇÏ°Ô ÁßøµÈ ¸®½ºÆ® ±¸Á¶·Î µÇ¾îÀÖ´Â ÀμöÀÇ first ¿Í rest ¸ðµÎ¿¡ Àç±ÍÀûÀ¸·Î È£ÃâÇÏ´Â ¹æ¹ýÀº Á¾Á¾ À¯¿ëÇÏ°Ô »ç¿ëµÈ´Ù. ´ÙÀ½ ÇÔ¼ö´Â ¸®½ºÆ®ÀÇ first ¿Í last ¸ðµÎ Àç±ÍÀûÀΠȣÃâÀ» ÇÏ¿© ÁÖ¾îÁø ±âÈ£ÀÇ ¸ð¾çÀ» Å×½ºÆ®ÇÏ´Â °ÍÀÌ´Ù.
> (defun search
(symbol expression)
(cond ((null
expression) nil)
((symbolp
expression) (eq expression symbol))
(t
(or (search symbol (first expression))
(search
symbol (rest expression))))))
SEARCH
> (search 'fred '(student
(name fred) (year junior)))
T
ÀÌÁ¦ ¼ýÀÚ¿Í ¼ýÀÚ½ÖÀÇ ¸®½ºÆ®¸¦ ÀÔ·ÂÀ¸·Î ¹Þ¾Æ ±× ¼ýÀÚ°¡ ½ÖµéÀÇ Ã¹¹øÂ° ¿ø¼Òµé Áß °¡Àå Å« °Íº¸´Ù Å©°Å³ª °¡Àå ÀÛÀº °Íº¸´Ù ÀÛÀ¸¸é nil À» ¸®ÅÏÇÏ´Â ÇÔ¼ö¸¦ Á¤ÀÇÇÑ´Ù. ¸¸ÀÏ ½Ö Áß¿¡¼ ù¹øÂ° ¿ø¼Ò°¡ ÁÖ¾îÁø ¼ýÀÚ¿Í °°Àº (=) °ÍÀÌ ÀÖÀ¸¸é, ±× ÇÔ¼ö´Â ±× ½ÖÀ¸·Î ÀÌ·ç¾îÁø ¸®½ºÆ®¸¦ ¸®ÅÏÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸é, ±× ÇÔ¼ö´Â µÎ °³°¡ ¿¬¼ÓÀûÀ¸·Î Á¸ÀçÇÏ´Â µÎ ½Ö Áß¿¡¼ ¾Õ ½ÖÀÇ Ã¹¹øÂ° ¿ø¼Ò´Â ±× ¼ýÀÚº¸´Ù ÀÛ°í, µÚ ½ÖÀÇ Ã¹¹øÂ° ¿ø¼Ò´Â ±× ¼ýÀÚº¸´Ù Å« °ÍÀ» ½ÖÀ¸·Î ¸¸µé¾î ¸®ÅÏÇÑ´Ù (Áï, ((1 2) (3 6))).
> (defun nearest-pairs
(x pairs)
(cond ((null pairs)
nil)
((=
x (first (first pairs)))
(list
(first pairs)))
((or
(< x (first (first pairs)))
(null
(rest pairs))) ())
((<
x (first (second pairs)))
(list
(first pairs) (second parties)))
(t
(nearest-pairs x (rest pairs)))))
NEAREST-PAIRS
> (setq pairs '((1
2) (2 4) (5 6)))
((1 2) (2 4) (5 6))
> (nearest-pairs 2 pairs)
((2
4))
> (nearest-pairs 3 pairs)
((2 4) (5 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 ÀڷḦ ±â¾ïÇÏ°í Æò°¡Çϱâ À§ÇÑ ÇÔ¼öµé
> (remember
1 1)
((1 1))
> (remember 2 3)
((1 1) (2 3))
> (remember
3 3)
((1 1) (2 3) (3 3))
> (estimate 2.4)
3
> (estimate
1.2)
1.4
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 ¸¦ »ç¿ëÇÏ´Â ¿¹°¡ ÀÖ´Ù.
> (setq tree
(make-TREE 1 (make-TREE 2 ( ) ( ))
(make-TREE
3 ( ) ( ))))
> (LABELED-BINARY-TREE 1 (LABELED-BINARY-TREE 2 NIL NIL)
(LABELED-BINARY-TREE
3 NIL NIL))
> (TREE-sub tree 3 7)
NIL
> tree
(LABELED-BINARY-TREE
1 (LABELED-BINARY-TREE 2 NIL NIL)
(LABELED-BINARY-TREE
7 NIL NIL))
±×¸² 13 ¸íĪÀ» °¡Áø ÀÌÁøÆ®¸®ÀÇ ¸íĪÀÌ Ä¡È¯µÇ±â Àü°ú ġȯµÈ ÈÄÀÇ ¸ð¾ç
±×¸² 13 Àº ÀÌ·¯ÇÑ È£Ãâ¿¡ »ý¼ºµÈ Ãß»óÀû ÀÚ·áÇüÀÇ »ç·Ê¿Í ¸íĪ ġȯÀ¸·ÎºÎÅÍÀÇ º¯È¸¦ ¼³¸íÇϰí ÀÖ´Ù.
ÀÌ Àå¿¡¼´Â Lisp °¡ Á¦°øÇÏ´Â ¼øÂ÷ÀûÀÎ ±â´É°ú ÀÚ·á Ãß»óÈ ±â´ÉÀ» ´ë·«ÀûÀ¸·Î¸¸ ¼³¸íÇÑ´Ù. Common Lisp °ú ±×°ÍÀÇ È®ÀåµÈ ¹öÀü¿¡¼´Â Å« ÇÁ·Î±×·¥À» ±¸¼ºÇÏ°í º¹ÀâÇÑ ÀÚ·áÇüÀ» ´Ù·ç±â À§ÇÑ ´Ù¾çÇÑ ±â¼úÀ» Æ÷ÇÔÇϰí ÀÖ´Ù. Lisp ´Â Ãß»óȸ¦ ÅëÇÏ¿© ½ÇÇèÇÏ´Â µ¥¿¡ ÈǸ¢ÇÑ È¯°æÀ» Á¦°øÇÑ´Ù. Lisp °¡ ¿µÇâÀ» Å©°Ô ³¢Ä£ ÇÑ ºÐ¾ß¸¦ ²Å´Â´Ù¸é °´Ã¼ÁöÇâ ÇÁ·Î±×·¡¹Ö (object-oriented programming) ¿¡ ´ëÇÑ »ó´ç·®ÀÇ ¿¬±¸°¡ Lisp ¸¦ »ç¿ëÇÏ¿© ÇàÇØÁ³´Ù´Â °ÍÀÌ´Ù. ¿À´Ã³¯, Common Lisp ¾È¿¡¼µµ °´Ã¼ÁöÇâ ÇÁ·Î±×·¡¹ÖÀ» À§ÇØ ¸¹Àº ±â´ÉÀÌ Á¦°øµÇ°í ÀÖ´Ù.
¾Õ Àý¿¡¼ Àç±Í È£Ãâ¿¡ ´ëÇÑ °Á¶¸¦ ÇßÁö¸¸, Lisp ÇÁ·Î±×·¡¹Ö¿¡¼ ´Ù¸¥ ¹Ýº¹ ±¸Á¶ Çü½ÄÀ» »ç¿ëÇÏ´Â °ÍÀ» ¸»¸®Áö´Â ¾Ê´Â´Ù. ´ÜÁö, Àç±ÍÀûÀΠǥÇöÀÌ °¡Àå ÀÚ¿¬½º·¯¿î ÇüÅ·ΠǥÇöµÇ´Â ³í¸® (logic) ¿Í ³í¸® ÇÁ·Î±×·¡¹Ö (logic programming) ¿¡ ´ëÇÑ Áö½ÄÀ» °¡´ÉÇϸé ÀÌ¿ëÇϰíÀÚ ÇÏ´Â °ÍÀÌ´Ù. Common Lisp ´Â ¹Ýº¹À» À§ÇÑ ´Ù¾çÇÑ ±¸Á¶¸¦ Á¦°øÇÑ´Ù. °è¼ÓÇØ¼ ´ÙÀ½ Àå¿¡¼ »ç¿ëÇÏ°Ô µÉ ±¸Á¶¿¡ ´ëÇØ¼ ¼¼úÇÑ´Ù.
Á¾Á¾ °°Àº ¿¬»êÀ» ¸®½ºÆ®¿¡ ÀÖ´Â ¸ðµç ±¸¼º¿ä¼Ò¿¡ Àû¿ëÇÏ´Â °ÍÀÌ Æí¸®ÇÒ ¶§°¡ ÀÖ´Ù. Lisp Àº À̰ÍÀ» À§Çؼ ´Ù¾çÇÑ ´ëÀÀ ±¸Á¶ (mapping construct) ¸¦ Á¦°øÇϰí ÀÖ´Ù. Mapcar Àº ù¹øÂ° Àμö¸¦ ´ÙÀ½¿¡ ¿À´Â ¸®½ºÆ®µé¿¡ ´ëÇØ °¢±â ´ëÀÀµÇ´Â ¿ø¼Òµé³¢¸® Àû¿ëÇÏ¿© ±× °á°úµéÀÇ ¸®½ºÆ®¸¦ ¸®ÅÏÇÑ´Ù. ¿©±â¿¡ ¼ýÀÚµéÀÇ ¸®½ºÆ®·Î Ç¥ÇöµÈ µÎ º¤ÅÍÀÇ ÇÕÀ» °è»êÇÏ´Â °£´ÜÇÑ ¹æ¹ýÀÌ ÀÖ´Ù.
> (mapcar #'(lambda
(x y)
(if
(> x y) x y))
'(2
7 5) '(1 9 4))
> (2 9 5)
Mapc ´Â °á°ú¿¡ ´ëÇØ¼ ¾Æ¹«°Íµµ ÇÏÁö ¾Ê´Â´Ù´Â °Í ¿Ü¿¡´Â mapcar ¿Í ºñ½ÁÇÏ´Ù. Mapc ´Â ´ÜÁö ºÎÀÛ¿ë (side effect) ¸¸À» À§Çؼ »ç¿ëµÈ´Ù. Mapcan Àº nconc ¸¦ ÀÌ¿ëÇÏ¿© °á°ú¸¦ µ¡ºÙÀÌ´Â °Í ¿Ü¿¡´Â mapcar ¿Í ºñ½ÁÇÏ´Ù.
> (mapcan #'(lambda
(x)
(if
(numberp x) (list x) nill))
'(1
2 nil 3 4 nil 5 6 7 nil 8 9 ))
(1 2 3 4 5 6 7 8 9)
Reduce ´Â ÀÌÁø¿¬»ê¿¡ ÇØ´çÇÏ´Â ÇÔ¼ö¿Í ÇϳªÀÇ ¸®½ºÆ®¸¦ Àμö·Î ÃëÇØ¼ ÀÌÁø¿¬»êÀ» »ç¿ëÇÏ¿© ¸®½ºÆ®ÀÇ ¿ø¼ÒµéÀ» °áÇÕÇÑ´Ù. ´ÙÀ½¿¡ reduce ¸¦ ¼³¸íÇÏ´Â µÎ ¿¹°¡ ÀÖ´Ù.
> (reduce #'+
'(1 2 3))
6
> (reduce #'(lambda (v w) (mapcar #'+ v w))
'((1
0 0) (0 1 0) (0 0 1)))
(1 1 1)
ù¹øÂ° ¿¹´Â ¼ýÀÚµéÀÇ ¸®½ºÆ®ÀÇ ÇÕÀ» °è»êÇÑ´Ù. µÎ¹øÂ° ¿¹´Â º¤Å͵éÀÇ ¸®½ºÆ®ÀÇ ÇÕÀ» °è»êÇÑ´Ù. ù¹øÂ° °æ¿ì¿¡´Â (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 ((i 1
(+ i 1))
(j
1 (* j i)))
((=
i 10) j)
(princ
l))
123456789
362880
´ÙÀ½¿¡ do ·çÇÁ°¡ ´ëÀÀ ÇÔ¼ö¸¦ Æ÷ÇÔÇÏ´Â ½ÄÀ» ¾î¶»°Ô ´ëÄ¡ÇÒ ¼ö ÀÖ´ÂÁö¸¦ ¼³¸íÇÏ´Â ¿¹°¡ ÀÖ´Ù.
> (setq list
'(1 2 3 4))
(1 2 3 4)
> (do ((args list (rest args))
(result
nil (cons (oddp (first args)) result)))
((null
args) (revere result)))
(T NIL T NIL)
> (mapcar #'oddp list)
(T
NIL T NIL)
ÀÌ¿Í °°ÀÌ Æ¯º°ÇÑ °æ¿ì¿¡´Â 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 ÀÇ °ªÀ» º¯°æÇÏ´Â °ÍÀº À§ÇèÇÏ´Ù. ÀÌ¿Í °°Àº ¹Ýº¹ ±¸Á¶µéÀ» ¼³¸íÇÏ´Â ¿¹µéÀº ´ÙÀ½°ú °°´Ù.
> (dolist (x
'(a b c)) (princ x))
ABC
> (dotimes (i 10 i) (princ i))
0123456789
10
´ÙÀ½ Àå¿¡¼ ¿ì¸®´Â ´ëÀÀ ÇÔ¼ö, Àç±Í È£Ã⠱׸®°í ÀÌµé ¹Ýº¹ ±¸Á¶µéÀ» »ç¿ëÇÑ ´Ù¸¥ ½ºÅ¸ÀÏÀÇ ÇÁ·Î±×·¡¹Ö ¹æ¹ýÀ» ¼³¸íÇÒ °ÍÀÌ´Ù. Ã¥¿¡ ³ª¿Â ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ´Â ¹æ¹ýÀº ÇÑ °¡Áö ¹æ¹ý¸¸ ÀÖ´Â °ÍÀº ¾Æ´Ï´Ù. ÆíÇÏ°Ô ´À³¥ ¼ö ÀÖ´Â ÄÚµù ½ºÅ¸ÀÏÀ» ã´Â ¿¬½ÀÀ» ÇØ¾ß ÇÑ´Ù.
´ëºÎºÐÀÇ °æ¿ì¿¡ ÀÖ¾î¼ Lisp ÇÁ·Î±×·¥À» µð¹ö±ëÇÏ´Â °ÍÀº ´Ù¸¥ ¾ð¾îÀÇ ÇÁ·Î±×·¥À» µð¹ö±ëÇÏ´Â °Í°ú ´Ù¸£Áö ¾Ê´Ù. Äڵ尡 ±â´ëÇß´ø ´ë·Î ½ÇÇàµÇÁö ¾ÊÀ¸¸é ¿ì¼± ÇÔ¼ö À̸§ÀÇ Ã¶ÀÚ°¡ Ʋ¸®Áö ¾Ê¾Ò´Â°¡, °ýÈ£°¡ ¸ÂÁö ¾Ê¾Ò´Â°¡, ÇÔ¼ö¿¡ Àü´ÞµÇ´Â ÀμöÀÇ °³¼ö°¡ ¸ÂÁö ¾Ê¾Ò´Â°¡, ºÎÀû´çÇÑ Àμö ¶Ç´Â °ªÀ» ÁöÁ¤Çϱâ Àü¿¡ º¯¼ö¸¦ ÀÌ¿ëÇÏÁö ¾Ê¾Ò´Â°¡ µî °¡Àå ÈçÇÑ ¿À·ù¸¦ °Ë»çÇÏ¸é¼ µð¹ö±ëÀ» ½ÃÀÛÇ϶ó.
´ëºÎºÐÀÇ ÃÖ±Ù¿¡ ±¸ÇöµÈ Lisp µéÀº Á¤±³ÇÑ µð¹ö±ë µµ±¸¸¦ Á¦°øÇϰí ÀÖÀ¸³ª, ÀÌ·¯ÇÑ µµ±¸µé¿¡ ´ëÇÑ ³íÀÇ´Â ÀÌ Ã¥ÀÇ ¹üÀ§¸¦ ¹þ¾î³´Ù. ±× ´ë½Å ¸ðµç Common Lisp ½Ã½ºÅÛ¿¡¼ »ç¿ëÇÒ ¼ö ÀÖ°í, ÀÌ Ã¥¿¡ ÀÖ´Â ¿¬½À¹®Á¦¸¦ À§Çؼµµ ÃæºÐÈ÷ ¾µ ¼ö ÀÖ´Â °£´ÜÇÑ µð¹ö±ë µµ±¸¿Í ±â¼úµéÀ» »ìÆìº»´Ù.
Äڵ尡 ½ÇÇàµÇ°í ÀÖ´Â µ¿¾È¿¡ Á¤º¸¸¦ ÇÁ¸°Æ®Çϱâ À§Çؼ princ ³ª ÀÌ ÀýÀÇ ¸¶Áö¸· ºÎºÐ¿¡ ¼³¸íÇÒ format À̶ó´Â Á»´õ º¹ÀâÇÑ ÇÁ¸°Æ® ±â´ÉÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. °¡Àå °£´ÜÇÏ°Ô µð¹ö±ëÀ» µµ¿ï ¼ö ÀÖ´Â ¹æ¹ý ÁßÀÇ Çϳª´Â º¯¼öÀÇ °ªÀÇ º¯È¸¦ ÃßÀûÇϱâ À§ÇØ Äڵ忡 ÀÓÀÇ·Î ÇÁ¸°Æ® ¹®À» ÷°¡ÇÏ´Â °ÍÀÌ´Ù.
Common Lisp ÀÇ trace ±â´ÉÀ» »ç¿ëÇÏ¿© ¾ðÁ¦ ¾î¶² Àμö·Î ¾î¶°ÇÑ ÇÔ¼ö°¡ È£ÃâµÇ´ÂÁö¸¦ ÃßÀûÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½ÀÇ ¿¹´Â ÀÌ ÀåÀÇ ¾ÕºÎºÐ¿¡¼ Á¤ÀÇµÈ µÎ °³ÀÇ ÇÔ¼ö¸¦ ¾î¶»°Ô ÃßÀûÇÏ´ÂÁö¸¦ ¼³¸íÇϰí ÀÖ´Ù.
> (trace raise
square)
(RAISE SQUARE)
> (square (raise 2 2))
1 Enter RAISE
2 2
| 2 Enter RAISE 2 1
| 3 Enter RAISE 2 0
| 3 Exit
RAISE 1
| 2 Exit RAISE 2
1 Exit RAISE 4
1 Exit SQUARE 4
1 Exit
SQUARE 16
16
untrace ¸¦ »ç¿ëÇÏ¿© ÇÔ¼ö¸¦ ÃßÀûÇÏ´Â °ÍÀ» ±×¸¸µÑ ¼ö ÀÖ´Ù.
> (untrace
raise)
(RAISE)
> (square (raise 2 2))
1 Enter SQUARE 4
1
Exit SQUARE 16
16
°¡²û trace ´Â ÃæºÐÇÑ Á¤º¸¸¦ Á¦°øÇÏÁö ¾Ê°Å³ª, ¹Ý´ë·Î ¿ì¸®°¡ ¿øÇÏ´Â °Íº¸´Ù ³Ê¹« ¸¹Àº Á¤º¸¸¦ Á¦°øÇϱ⵵ ÇÑ´Ù. ±×·± °æ¿ì¿¡´Â ÇÑ ´Ü°è¸¸À» Á¶»çÇÏ´Â °ÍÀÌ À¯¿ëÇÒ °ÍÀÌ´Ù. step À̶ó´Â °ÍÀÌ ¹Ù·Î ±× ±â´ÉÀ» ÇÑ´Ù. trace ÀÇ »ó¼¼ÇÑ ºÎºÐ°ú ¸¶Âù°¡Áö·Î step ÀÇ »ó¼¼ÇÑ ºÎºÐÀº Common Lisp ÀÇ ½Ã½ºÅÛ¿¡ µû¶ó Á¦°¢±â ´Ù¸£´Ù. ´ÙÀ½ ¿¹´Â step À» »ç¿ëÇÏ¸é ¹«¾ùÀÌ À¯¿ëÇÑÁö¸¦ º¸¿©ÁÙ °ÍÀÌ´Ù.
> (setq
n 3)
3
> (step (square n))
(SQUARE N)
¡æ :h
:n Eveluate current
expression in step mode.
:s
Evaluate current expression without stepping.
:x
Finish evaluation, but tum Stepper off.
:p
Print current expression.
:b
Enter the Debugger.
:q
Exit to Top Level.
:h
Print this text.
(SQUARE N) ¡æ :n
(FUNCTION SQUARE) ¡æ
:n
#<Interpreted-function (NAMED-LAMBDA SQUARE (x)
(BLOCK
SQUARE (* X X))) 100DCD6>
N = 3
(BLOCK
SQUARE (* X X)) ¡æ :n
(*
X X) ¡æ :n
(function *)
¡æ :n
#<Compiled-function
* 4ABA76>
X
= 3
X = 3
ÀÌ ¿¹¿¡¼ :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 À» »ç¿ëÇÏ´Â ¸î °¡Áö ¹æ¹ýÀ» º¸¿©ÁÖ°í ÀÖ´Ù.
> (format nil
:~D is an integer, ~A is a symbol" 17 'foo)
"17 is an integer,
FOO is a symbol"
> (format nil "~4,2F is a real number"
1.2356)
"1.23 is a real number"
> (let ((x 6) (y 1.2))
(format nil "~D times ~4,2F
is ~4,2F" x y (*x y)))
"6 times 1.20 is 7.20"
>
(format nil "Here~%is a line break.")
"Here
is a line
break."
¼½Ä ¸í·É ~4,2F ´Â Á¤ÇØÁø ¼½ÄÀ» ÇÁ¸°Æ®ÇÒ ¶§ »ç¿ëµÇ´Âµ¥, ¿©±â¼´Â ¼Ò¼öÁ¡À» Æ÷ÇÔÇÏ¿© ÃÖ¼Ò ³× °³ÀÇ ÀÚ¸®¼ö·Î ½Ç¼ö¸¦ Ç¥ÇöÇϰí, ¼Ò¼öÁ¡ ÀÌÇÏ´Â µÎ ÀÚ¸®·Î Ç¥ÇöÇ϶ó´Â °ÍÀ» Áö½ÃÇÑ´Ù. ¼½Ä ¸í·É ~A ´Â princ ·Î ÇÁ¸°Æ®ÇÏ´Â °Í°ú ¸¶Âù°¡Áö·Î ÀÓÀÇÀÇ °´Ã¼¸¦ ÇÁ¸°Æ®ÇÏ´Â µ¥¿¡ »ç¿ëµÈ´Ù. ¸¸ÀÏ destination ÀÌ nil À̸é format Àº ¼½ÄÈµÈ ¹®ÀÚ¿À» ¸®ÅÏÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸é, format ´Â nil À» ¸®ÅÏÇÏ¸é¼ ¹®ÀÚ¿À» ÁöÁ¤µÈ destination À¸·Î º¸³½´Ù. ¸¸ÀÏ destination ÀÌ t À̸é format Àº ÀϹÝÀûÀ¸·Î Lisp ÇØ¼®±â°¡ »ç¿ëÇϰí ÀÖ´Â Å͹̳ÎÀ̳ª ȸéÀÎ ±âº» Ãâ·Â (standard output) À¸·Î ÇÁ¸°Æ®ÇÑ´Ù.
Common Lisp ´Â ¿À·ù¿¡ ´ëóÇϰųª ÇØ¼®±â¿Í ´ëÈÇϱâ À§ÇÑ ´Ù¾çÇÑ ÇÁ¸°Æ® ·çƾÀ» Á¦°øÇÑ´Ù. Lisp ÇØ¼®±â¸¦ ´Ù·ç¸é¼ À¯¿ëÇÏ´Ù°í »ý°¢µÇ´Â °Í Çϳª¸¦ ¼Ò°³ÇϰڴÙ. (setq *print-pretty* t) ¶ó°í ½ÇÇàÇÏ¸é ¸¹ÀÌ ÁßøµÈ ¸®½ºÆ® ±¸Á¶¸¦ ÈξÀ Àб⠽±µµ·Ï º¸ÀÌ°Ô ÇÒ ¼ö ÀÖ´Ù.
ÀÌ ÀåÀÇ Ã³À½ ºÎºÐ¿¡¼ ¹è´Þ ·Îº¿ÀÇ ÇൿÀ» Á¦¾îÇÏ´Â ±ÔÄ¢µéÀ» »ç¿ëÇÏ´Â ÀÀ¿ë ¿¹¸¦ ¼³¸íÇß´Ù. °¨°¢±â±â¿Í °¨°¢±â±âÀÇ °ªµéÀ» Ç¥ÇöÇϰí Á¦¾î ¸Å°³º¯¼ö¿Í ±×°ÍµéÀÇ °¡´ÉÇÑ °ªÀ» Ç¥ÇöÇϱâ À§ÇÑ ±âÈ£¸¦ µµÀÔÇÏ¿´´Ù. ÀÌÁ¦ ·Îº¿À» Á¦¾îÇϱâ À§ÇØ »ç¿ëµÇ´Â ÇÊ¿äÇÑ ±ÔÄ¢°ú ÇÁ·Î½ÃÀú¸¦ ¹¦»çÇϱâ À§ÇÑ ÇÊ¿äÇÑ Áغñ¸¦ ¸ðµÎ °®Ãß¾ú´Ù. ¿ì¼±, °¨°¢±â±âÀÇ °ª°ú Á¦¾î ¸Å°³º¯¼öÀÇ °ª¿¡ ´ëÇÑ ¸®Æ÷Æ®¸¦ À§ÇÑ ÀÚ·á Ãß»óȷκÎÅÍ ¾Ë¾Æº¸ÀÚ.
(defun make-TUPLE
(param value) (list param value))
(defun TUPLE-param (tuple) (first tuple))
(defun
TUPLE-value (tuple) (second tuple))
¿¹¸¦ µé¾î, (forward near) ´Â forward °¨°¢±â±â°¡ near ÀÇ °ªÀ» °¡Áö°í ÀÖ´Ù´Â ¸®Æ÷Æ®¿¡ ÇØ´çÇÑ´Ù.
°°Àº °¨°¢±â±â´Â ´Ù¸¥ ½Ã°£¿¡ ´Ù¸¥ º¸°í¸¦ ÇÒ °ÍÀÌ´Ù. ¸®Æ÷Æ®ÀÇ ½Ã°£¿¡ ´ëÇÑ »çÇ×À» °è¼Ó À¯ÁöÇϱâ À§Çؼ, ¿ì¸®´Â °¢ ¸®Æ÷Æ®°¡ ¹ß»ýÇÑ ½Ã°£¿¡ ÇØ´çÇÏ´Â Á¤¼ö¸¦ ¿¬°ü½ÃŲ´Ù. ´ÙÀ½ÀÇ ÀÚ·á Ãß»óÈ´Â °¨°¢±â±â¿Í ¸Å°³º¯¼ö ¸®Æ÷Æ®¿¡ »ç¿ëµÈ´Ù.
(defun make-REPORT
(tuple stamp) (list tuple stamp))
(defun REPORT-tuple (report) (first
report))
(defun REPORT-stamp (report) (second report))
(defun REPORT-param
(report) (TUPLE-param (first report)))
¿¹¸¦ µé¾î, ((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 '(left
far) '(((left far) 1)))
NIL
> (assoc '(left far) '(((left far)
1)) :test #'equal)
((left far) 1)
°»½ÅµÈ ¸®Æ÷Æ®¸¦ ã±â À§Çؼ °°Àº ¸Å°³º¯¼ö¿¡ ´ëÇØ ´Ù¸¥ °ªÀ» °¡Áø »õ·Î¿î ¸®Æ÷Æ®¸¦ ã´Â´Ù.
> (assoc '(left
far) '(((left near) 1)) :test #'equal)
NIL
> (assoc '(left far)
'(((left near) 1))
:test
#'(lambda (x y) (eq (first x) (first y))))
> ((left near) 1)
¶Ç ´Ù¸¥ ¼±Åà Ű¿öµå Àμö¸¦ »ç¿ëÇÏ¿© ¿¬»ó ¸®½ºÆ®¿¡ ÀÖ´Â ½ÖµéÀÇ Ã¹¹øÂ° ¿ø¼Ò¸¦ °¡¸®Å°µµ·Ï ÇÏ¿© °°Àº °á°ú¸¦ ¾òÀ» ¼ö ÀÖ´Ù.
> (assoc 'left
(((left far) 1)) :key #'first)
((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 ¸¦ »ç¿ëÇÏ¿© ÀÚ·á Ãß»óȸ¦ À¯ÁöÇÏ¸é¼ ¸®Æ÷Æ®ÀÇ ¸®½ºÆ®¿¡ ´ëÇÑ ¿¬°ü°è»êÀ» ¼öÇàÇÏ´Â µÎ °³ÀÇ ÇÔ¼ö¸¦ Á¤ÀÇÇØº¸ÀÚ. ù¹øÂ° ÇÔ¼ö´Â ƯÁ¤ ¸Å°³º¯¼ö¸¦ Æ©Ç÷Π¸®Æ÷Æ®¸¦ ã´Â °ÍÀ̰í, µÎ¹øÂ° ÇÔ¼ö´Â Æ©Ç÷Π¸®½ºÆ®¸¦ ã´Â´Ù.¤¿
(defun param-assoc
(param reports)
(find param
reports :key #'REPORT-param))
(defun tuple-assoc (tuple reports)
(find tuple reports :test #'equal
:key #'REPORT-tuple))
ÀÌÁ¦, update ¿¡ ´ëÇÑ ¾Ë°í¸®ÁòÀ» ´ÙÀ½°ú °°ÀÌ ¼¼úÇÒ ¼ö ÀÖ´Ù. ¿ì¸®´Â ½Ã°£ µµÀåÀÌ ÂïÈù ¸®Æ÷Æ®ÀÇ µÎ ¸®½ºÆ®·Î update ¸¦ È£ÃâÇÑ´Ù. ÀÌÀü ¸®Æ÷Æ®µéÀÇ ¸®½ºÆ®¿¡ ÀÖ´Â °¢ ½Ã°£ µµÀå ÂïÈù ¸®Æ÷Æ®¿¡ ´ëÇÏ¿© °°Àº ¸Å°³º¯¼ö¸¦ °¡Áø »õ·Î¿î ¸®Æ÷Æ®°¡ Àִ°¡¸¦ »ìÆìº»´Ù. ¸¸ÀÏ ±×·¸´Ù¸é, ¸®Æ÷Æ®ÀÇ ¸®½ºÆ®¿¡ »õ·Î¿î ¸®Æ÷Æ®¸¦ ÷°¡Çϰí update ¿¡ ÀÇÇØ¼ ¸®ÅÏÀÌ µÇµµ·Ï ÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸é ÀÌÀü ¸®Æ÷Æ®¸¦ ¸®Æ÷Æ®ÀÇ ¸®½ºÆ®¿¡ ÷°¡ÇÏ°í ¸®ÅÏÇÑ´Ù. ÀÌ ¾Ë°í¸®ÁòÀº Lisp À¸·Î ´ÙÀ½°ú °°ÀÌ ±¸ÇöµÈ´Ù.
(defun update
(new old)
(mapcar #' (lambda (item)
(or
(param-assoc (REPORT-param item) new)
item))
old))
(or first second) ÀÇ Çü½ÄÀº (let ((result first)) (if (null result) second result)) ¸¦ °è»êÇϰí ÀÖ´Ù.
update ¸¦ ±¸ÇöÇÏ´Â ¶Ç ´Ù¸¥ ¹æ¹ýÀ» »ý°¢ÇØ º¸ÀÚ. ÀÌ °æ¿ì¿¡¼´Â ÀÌÀü °ÍÀ̳ª »õ·Î¿î ¸®Æ÷Æ® ¸ðµÎ °¨°¢±â±â¿Í Á¦¾î ¸Å°³º¯¼ö¿¡ ´ëÇÑ ¸®Æ÷Æ®¸¦ ¹Ýµå½Ã Æ÷ÇÔÇÒ Çʿ䰡 ¾ø°í °°Àº ¸Å°³º¯¼öÀÇ ¿©·¯ ½Ã°£¿¡¼ÀÇ ¸®Æ÷Æ®µéÀ» Æ÷ÇÔÇÒ ¼ö ÀÖ´Ù°í °¡Á¤Çغ¸ÀÚ. ´ÙÀ½ÀÇ ±¸Çö¿¡¼ dolist ÀÇ ¹Ýº¹ ±¸Á¶¿Í ¸®Æ÷Æ®¸¦ Àμö·Î ÇÏ°í ±×°ÍÀ» ÀÌÀü ¸®Æ÷Æ®¿Í °áÇÕÇÏ´Â fuse ¶ó´Â ¼ºê·çƾÀ» »ç¿ëÇÑ´Ù. ÀÌÀü ¾Ë°í¸®Áò¿¡¼¿Í °°ÀÌ ½Ã°£ µµÀåÀÌ ÂïÈù ¸®Æ÷Æ®µéÀÇ µÎ ¸®½ºÆ®·Î update ¸¦ È£ÃâÇÑ´Ù. ±×·¯³ª ÀÌ °æ¿ì¿¡´Â fuse ¼ºê·çƾÀ» »ç¿ëÇÏ¿© ÀÌÀüÀÇ ¸®Æ÷Æ®ÀÇ ¸®½ºÆ®¸¦ °»½ÅÇÏ¸é¼ »õ·Î¿î ¸®Æ÷Æ®µéÀ» Çѹø¿¡ Çϳª¾¿ ´Ü°èÀûÀ¸·Î ó¸®ÇÑ´Ù.
(defun update
(new old)
(dolist (item new
old) (setq old (fuse item old))))
Fuse ´Â ÇϳªÀÇ ¸®Æ÷Æ®¿Í ¸®Æ÷Æ®µéÀÇ ¸®½ºÆ®¸¦ Àμö·Î ÃëÇÑ´Ù. ¸¸ÀÏ Ã¹¹øÂ° Àμöº¸´Ù ºü¸¥ ½Ã°£ µµÀåÀ» °¡Áö¸ç °°Àº ¸Å°³º¯¼ö¿¡ ´ëÇØ º¸°íÇÏ´Â ¸®Æ÷Æ®°¡ ¸®½ºÆ®¿¡ ÀÖÀ¸¸é óÀ½ ³ª¿À´Â ±× ¸®Æ÷Æ®¸¦ ù¹øÂ° Àμö·Î ġȯÇϰí, ±×·± ¸®Æ÷Æ®°¡ ¾øÀ¸¸é ¸®Æ÷Æ® ¸®½ºÆ®ÀÇ ¸¶Áö¸·¿¡ ù¹øÀç Àμö¸¦ ÷°¡ÇÑ´Ù. Fuse ´Â Àç±Í È£ÃâÀ» »ç¿ëÇÏ¿© first ¿Í rest ·Î ÀÌÀü ¸®Æ÷Æ® ¸®½ºÆ®¸¦ ºÐ¸®Çϰí, cons ·Î ´Ù½Ã ÇÕÄ£´Ù. °°Àº ¸Å°³º¯¼ö¸¦ °¡Áø ÀÌÀü ¸®Æ÷Æ® ´ë½Å¿¡ »õ·Î¿î ¸®Æ÷Æ®¸¦ ġȯÇϰųª ¶Ç´Â ±×·¯ÇÑ ÀÌÀü ¸®Æ÷Æ®°¡ ¾øÀ¸¸é ÀÌÀü ¸®Æ÷Æ®µéÀÇ ³¡¿¡ »õ·Î¿î ¸®Æ÷Æ®¸¦ µ¡ºÙÀδÙ.
(defun fuse (report
old)
(cond ((null old) (list report))
((eq
(REPORT-param report) (REPORT-param (first old)))
(if
(> (REPORT-stamp report) (REPORT-stamp (first old)))
(cons
report (rest old)) old))
(t
(cons (first old) (fuse report (rest old)))))))
´ÙÀ½Àº update °¡ ¾î¶»°Ô µ¿ÀÛÇÏ´ÂÁö¸¦ º¸¿©ÁÖ´Â ¿¹ÀÌ´Ù.
> (update '(((forward
near) 2) ((left near) 2) ((left far) 1))
'(((forward
far) 0) ((left away) 0) ((right near) 1)
((rear
far) 0) ((speed slow) 1)))
(((LEFT NEAR) 2) ((FORWARD NEAR) 2) ((RIGHT
NEAR) 1)
((REAR FAR) 0) ((SPEED SLOW) 1))
´ÙÀ½¿¡ 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) ¸¦ ¸®ÅÏÇÑ´Ù.
(defun fuse (report
old)
(let ((a (param-assoc (REPORT-param report) old)))
(cond ((null a) (cons report old))
((<
(REPORT-stamp report) (REPORT-stamp a)) old)
(t
(cons report (remove a old)))))))
(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 ÇÔ¼ö´Â ¾ð±ÞÇß´ø °Íº¸´Ù ÈξÀ À¶Å뼺ÀÌ ÀÖ´Ù. Áï, ¸¹Àº ÇÔ¼öµéÀº ¼³¸íÇÑ °Íº¸´Ù Ű¿öµå¸¦ ´õ ¸¹ÀÌ °¡Áö°í ÀÖ´Ù. °Ô´Ù°¡ ¸®½ºÆ®¿¡ Àû¿ëÇÒ ¼ö ÀÖ´Â ÇÔ¼ö Áß ´ëºÎºÐÀº ¸®½ºÆ®¿Í ÀÏÂ÷¿ø ¹è¿À» Æ÷ÇÔÇÏ´Â º¸´Ù ÀϹÝÀûÀÎ ¼øÂ÷ÀûÀÎ ÀÚ·á¿¡µµ Àû¿ëÇÒ ¼ö ÀÖ´Ù.
ÀÌÁ¦, °¨°¢±â±â ¸®Æ÷Æ®¸¦ °»½ÅÇÒ ¼ö ÀÖ°Ô µÇ¾úÀ¸´Ï ¾î¶°ÇÑ ÇàÀ§¸¦ ÃëÇØ¾ß Çϴ°¡¸¦ °áÁ¤ÇÒ Çʿ䰡 ÀÖ´Ù. ±× Á¦¾î Àü·«Àº ±ÔÄ¢ÀÇ ÁýÇÕÀ¸·Î ÄÚµåȵǾî ÀÖ´Ù. ¿ì¸®´Â ±ÔÄ¢À» À§ÇØ ´ÙÀ½°ú °°Àº ÀÚ·á Ãß»óȸ¦ »ç¿ëÇÑ´Ù.
(defun RULE-conditions
(rule) (first rule))
(defun RULE-action (rule) (second rule))
Á¶°Ç (condition) Àº °¨°¢±â±â/°ª½Ö¿¡ ÇØ´çÇϰí, ÇàÀ§ (action) ´Â Á¦¾î ¸Å°³º¯¼ö/°ªÀÇ ½Ö¿¡ ÇØ´çÇÑ´Ù. ±ÔÄ¢ÀÇ °¢ Á¶°ÇÀÌ ¸®Æ÷Æ®¿Í equal ÀÇ °ü°è·Î ¿¬°üµÇ¾î ÀÖÀ¸¸é ±× ±ÔÄ¢Àº ÁÖ¾îÁø ¸®Æ÷Æ®µéÀÇ ÁýÇÕ¿¡ ´ëÇØ¼ Àû¿ë°¡´ÉÇÏ´Ù¶ó°í ÇÑ´Ù. ´ÙÀ½ ÇÔ¼ö´Â ±ÔÄ¢ÀÌ Àû¿ë°¡´ÉÇѰ¡¸¦ °áÁ¤ÇÏ´Â ¼ú¾î¸¦ ±¸ÇöÇÑ °ÍÀÌ´Ù.
(defun applicablep
(rule reports)
(aux-applicablep
(RULE-conditions rule) reports))
(defun aux-applicablep (tuples reports)
(or (null tuples)
(and
(tuple-assoc (first tuples) report)
(aux-applicablep
(rest tuples) reports))))
Applicablep ´Â ±ÔÄ¢°ú ½Ã°£ µµÀåÀÌ ÂïÈù ¸®Æ÷Æ®µéÀÇ ¸®½ºÆ®¸¦ Àμö·Î ÃëÇϰí, ±× ±ÔÄ¢ÀÇ Á¶°Ç ¸®½ºÆ®¿¡ ÀÖ´Â °¢ Á¶°ÇÀÌ ¸®Æ÷Æ® ¸®½ºÆ®¿¡ ÀÖ´Â ÇÑ ¸®Æ÷Æ®¿¡ ÇØ´çÇϴ°¡¸¦ Àç±Í È£ÃâÀ» »ç¿ëÇÏ¿© °Ë»çÇÑ´Ù. º¸Á¶ ÇÔ¼ö´Â Àç±Í È£Ãâ¿¡ µé¾î°¡´Â tuples ¶ó´Â º¯¼ö¸¦ µµÀÔÇÏ¿© Àç±Í È£ÃâÀ» ¿Ï¼ºÇÑ´Ù. ÀÌ¿Í °°Àº º¸Á¶ ÇÔ¼ö´Â Àç±ÍÀûÀÎ ÇÁ·Î½ÃÀú¸¦ ±¸ÇöÇÏ´Â µ¥¿¡ ¸¹ÀÌ ¾²ÀδÙ.
¿ì¸®´Â ¶ÇÇÑ ºÎ¿ïÇÔ¼ö¿Í °°ÀÌ µ¿ÀÛÇϴ Ưº°ÇÑ ´ëÀÀ ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© applicablep ¸¦ ±¸ÇöÇÒ ¼ö ÀÖ´Ù. (every test arguments) ¶ó´Â ½ÄÀº test °¡ arguments ÀÇ °¢°¢ÀÇ ¿ø¼Ò¿¡ ³¢¸®³¢¸® Àû¿ëµÉ ¶§¿¡ ¸ðµÎ nil ÀÌ ¾Æ´Ï¸é t ¸¦ ¸®ÅÏÇÑ´Ù. ¿¹¸¦ µé¾î (every #'oddp '(3 5 9)) ¿Í (every #'eq '(a 1) '(a 1)) Àº ¸ðµÎ t ¸¦ ¸®ÅÏÇÑ´Ù.
(defun applicablep
((rule reports)
(every #'(lambda (tuple) (tuple-assoc
tuple reports))
(RULE-conditions
rule)))
´ÙÀ½ ÇÔ¼ö´Â ±ÔÄ¢ ÁýÇÕ¿¡ ÀÖ´Â ¸ðµç ±ÔÄ¢À» Å×½ºÆ®Çϰí, ±× Áß Àû¿ë°¡´ÉÇÑ ±ÔÄ¢¿¡ µû¶ó ½ÇÇàÇÑ´Ù.
(defun react (rules
reports)
(dolist (rule rules reports)
(if
(applicablep rule reports)
(setq
reports (fuse (act (RULE-action rule)) reports)))))
¿ì¸®°¡ °£´ÜÇÏ°Ô ±¸ÇöÇÑ °Í¿¡¼ ½ÇÁ¦·Î ÀÌ·ç¾îÁö´Â °ÍÀº ´ÜÁö ±ÔÄ¢ÀÇ ÇàÀ§¿¡ ½Ã°£ µµÀåÀ» Ãß°¡ÇÏ´Â °Í»ÓÀÌ´Ù. Common Lisp ÇÔ¼öÀÎ get-intermal-real-time Àº ÇöÀçÀÇ ½Ã°£À» Ç¥ÇöÇÏ´Â Á¤¼ö°ªÀ» ¸®ÅÏÇÑ´Ù.
(defun act (action) (list action (get-internal-real-time)
¿©±â¿¡ react ÀÇ °á°ú¸¦ º¸¿©ÁÖ´Â °£´ÜÇÑ ¿¹°¡ ÀÖ´Ù.
> (react '((((forward
near) (jleft far)) (turn left)))
'(((forward
near) 0) ((turn right) 1) ((jleft far) 1)))
(((TURN LEFT) 2214639) ((FORWARD
NEAR) 0) ((JLEFT FAR) 1))
¸¸ÀÏ, ¼·Î ¾î±ß³ª´Â µÎ °³ ÀÌ»óÀÇ Àû¿ë°¡´ÉÇÑ ±ÔÄ¢ÀÌ ÀÖ´Â °æ¿ì¿¡´Â ÇÔ¼ö´Â °¢ ÇàÀ§¿¡ 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) ¸¦ ¸®ÅÏÇÑ´Ù.
(defun react (rules
reports)
(update (mapcan #'(lambda (rule)
(and
(applicablep rule reports)
(list
(act (RULE-action rule)))))
rules)
reports))
run À̶ó´Â ÇÔ¼ö´Â Lisp ÀÇ ¹Ýº¹ ±¸Á¶ÀÎ dotimes ¸¦ »ç¿ëÇÏ¿© react ¿Í update ¸¦ ÇÑ »çÀÌŬ¿¡¼ Àû¿ëÇÑ´Ù. collect °¡ °¡Àå ÃÖ±ÙÀÇ °¨°¢±â±â ¸®Æ÷Æ®¸¦ ¸®ÅÏÇÑ´Ù°í °¡Á¤ÇÏÀÚ.
(defun run (rules
reports)
(dotimes (index 100 reports)
(setq
reports (react rules (update (collect) reorts)))))
ÀÌ ÇÔ¼ö´Â 0 ºÎÅÍ 99 ±îÁöÀÇ index °ªÀ¸·Î 100 ¹øÀÇ »çÀÌŬÀ» ¼öÇàÇÑ´Ù. ¶Ç ´Ù¸¥ ¹æ¹ýÀ¸·Î »óÈ£°£¿¡ È£ÃâÇÏ´Â Àç±ÍÇÔ¼ö¸¦ »ç¿ëÇÏ¿© run À» ±¸ÇöÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
(defun run (rules
reports)
(aux-update rules (collect) reports 0))
(defun
aux-update (rules new old i)
(if (< i 100) (aux-react
rules (update new old) i)))
(defun aux-react (rules reports i)
(aux-update
rules (collect) (react rules reports) (+ i 1)))
¼³¸íÇÑ ¹Ù¿Í °°ÀÌ, 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] ¿¡ ÀÇÇÑ Ã¥À» ÂüÁ¶Çϱ⠹ٶõ´Ù.