±âÈ£ ÇÁ·Î±×·¡¹Ö
ÀΰøÁö´É ÀÌ·Ð ¹× ½ÇÁ¦ : 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] ¿¡ ÀÇÇÑ Ã¥À» ÂüÁ¶Çϱ⠹ٶõ´Ù.