[Áöµð³ÝÄÚ¸®¾Æ]LISP´Â 1958³â Á¸ ¸ÆÄ«½Ã¿¡ ÀÇÇØ óÀ½À¸·Î ±¸ÇöµÇ±â ½ÃÀÛÇßÀ¸¸ç, ƯÈ÷ ÀΰøÁö´É ºÐ¾ß¿¡¼ ÈçÈ÷ »ç¿ëµÇ°í ÀÖ´Â ¾ð¾îÀÌ´Ù. ¿ª»ç°¡ ¿À·¡µÈ ÇÁ·Î±×·¡¹Ö ¾ð¾î¶ó°í ÇØ¼ ½Ã´ë¿¡ µÚÃÄÁ³À» °Å¶ó°í »ý°¢ÇÑ´Ù¸é ¿À»êÀÌ´Ù. LISP´Â ƯÀ¯ÀÇ ±â¹Î¼ºÀ¸·Î ƯÈ÷ ¿À´Ã³¯°ú °°ÀÌ °æÀïÀûÀ¸·Î Á¦Ç°À̳ª ¼ºñ½º¸¦ ¿Ï¼ºÇØ¾ß ÇÏ´Â Çö½Ç¿¡¼´Â ´Ù¸¥ ¾î¶°ÇÑ ÇÁ·Î±×·¡¹Ö ¾ð¾îº¸´Ùµµ ºü¸£°í ÀûÀýÇÑ ÇÁ·Î±×·¡¹ÖÀÌ °¡´ÉÅä·Ï µµ¿ÍÁØ´Ù. Çö´ëÀû LISP Ç¥ÁØÀÎ Ä¿¸Õ LISP(Common LISP, ÀÌÇÏ CL)´Â ƯÈ÷ ¾î·Æ°í µµÀüÀûÀÎ ºÐ¾ß¿¡¼ ¸¹ÀÌ »ç¿ëµÇ°í Àִµ¥, µ¶ÀÚµéÀ» ÀÌ·± ±â¹ÎÇÑ CL ÇÁ·Î±×·¡¹Ö ¼¼°è·Î ÃÊ´ëÇÏ·Á°í ÇÑ´Ù.
¡®¼º´ç°ú ½ÃÀ塯À¸·Î Àß ¾Ë·ÁÁø ¿¡¸¯ ·¹À̸յå(Eric Raymond)´Â ¡®ÇØÄ¿°¡ µÇ´Â ¹æ¹ý(How to become a hacker)¡¯¿¡¼ LISP¿¡ ´ëÇØ ´ÙÀ½°ú °°ÀÌ À̾߱âÇϰí ÀÖ´Ù.
<»ý·«> - ´Ù¸¥ ÇÁ·Î±×·¡¹Ö ¾ð¾îÀÇ Á߿伺¿¡ ´ëÇÑ À̾߱âµé
Lisp´Â (À§¿¡¼ ¾ð±ÞÇÑ ÇÁ·Î±×·¡¹Ö ¾ð¾îµé°ú´Â) ´Ù¸¥ ÀÌÀ¯ - Áï ±× ¾ð¾î¿¡ Á¤ÅëÇÏ°Ô µÉ ¶§ ¾ò´Â ½É¿ÀÇÑ ±ú´ÞÀ½ÀÇ °æÇè - ¿¡¼ ¹è¿ï ¸¸ÇÑ °¡Ä¡°¡ ÀÖ´Ù. ÀÌ·± °æÇèÀ» ÅëÇØ ½ÇÁ¦·Î´Â Lisp¸¦ ¸¹ÀÌ »ç¿ëÄ¡ ¸øÇÑ´Ù ÇÏ´õ¶óµµ ³²Àº »ý¾Ö µ¿¾È ¿©·¯ºÐÀº ÈǸ¢ÇÑ ÇÁ·Î±×·¡¸Ó·Î °Åµì³ª°Ô µÉ °ÍÀÌ´Ù.
¿¡¸¯ ·¹À̸յ尡 ¸»ÇÏ´Â ½É¿ÀÇÑ ±ú´ÞÀ½ÀÇ °æÇèÀ̶õ ¹«¾ùÀϱî? ÃßÃøÄÁ´ë ±×°ÍÀº Lisp°¡ °®´Â ¸ÞŸ ¼øÈ¯ÀûÀΠƯ¡, Áï ÄÚµå¿Í µ¥ÀÌÅÍÀÇ ±¸Á¶°¡ °°±â ¶§¹®¿¡ °æÇèÇÒ ¼ö ÀÖ´Â ¡®ÇÁ·Î±×·¡¹Ö ¾ð¾î ÀÚü¿¡ ´ëÇÑ ÇÁ·Î±×·¡¹Ö¡¯ÀÏ °ÍÀÌ´Ù. Áö³ ¼ö½Ê ³â°£ ´Ù¸¥ ÇÁ·Î±×·¡¹Ö ¾ð¾î¿¡¼ LispÀÇ ¿©·¯ Ư¡À» ¸ð¹æÇØ¿ÔÁö¸¸, ¾ÆÁ÷ LispÀÇ ¾Õ¼ ¸»ÇÑ Æ¯Â¡À» Á¦´ë·Î ±¸ÇöÇϰųª ¸ð¹æÇϰí ÀÖ´Â ÇÁ·Î±×·¡¹Ö ¾ð¾î´Â Á¸ÀçÇÏÁö ¾Ê´Â´Ù.
¾î´À Á¤µµ ¼öÁØ¿¡ À̸¥ Lisp ÇÁ·Î±×·¡¸ÓÀÇ ÇÁ·Î±×·¡¹Ö ¹æ¹ýÀº ÀÚ½ÅÀÌ ÇØ°áÇØ¾ß ÇÒ ¹®Á¦¸¦ È¿°úÀûÀ¸·Î ±â¼úÇÒ ¼ö ÀÖ´Â ÇÁ·Î±×·¡¹Ö ¾ð¾î¸¦ ¸¸µç ÈÄ ¹®Á¦¸¦ °ø·«ÇÏ´Â °ÍÀÌ´Ù. ÀÌ·± ¹æ½ÄÀÇ ÇÁ·Î±×·¡¹ÖÀº °³¹ßÀÚ·Î ÇÏ¿©±Ý ÀÚ½ÅÀÇ »ý°¢À» ÃæºÐÈ÷ ³ôÀº Ãþ¿¡¼ Ãß»óÈÇØ »ý°¢ÇÒ ¼ö ÀÖ°Ô ÇØÁÖ¸ç, ±× »ý°¢À» °ÅÀÇ ¿©°ú ¾øÀÌ °¡»óÀÇ È®Àå ¾ð¾î·Î ±â¼úÇÑ ÈÄ °¡»óÀÇ ¾ð¾î¿Í Lisp »çÀÌÀÇ Â÷À̸¦ ¸Þ¿ö¼ ¿Ï¼ºÇÏ´Â ÇüÅ·Π¼³¸íÇÒ ¼ö ÀÖ´Ù.
¹®Á¦ ¿µ¿ªÀ» ±â¼úÇϱâ À§ÇÑ È®Àå ¾ð¾î¸¦ °³¹ßÇÏ¸é¼ ¹®Á¦ ÀÚü¸¦ ÇÑÃþ ´õ ±íÀÌ ÀÖ°Ô ÀÌÇØÇÒ ¼ö ÀÖÀ¸¸ç, È®Àå ¾ð¾î¸¦ ÅëÇØ ¹®Á¦ ¿µ¿ª¿¡ ´ëÇÑ ÇÁ·Î±×·¡¹ÖÇϱ⠶§¹®¿¡ ÁýÁßÀûÀÌ°í ±â¹ÎÇÏ°Ô ¹®Á¦¸¦ ÇØ°á ÇÒ ¼ö ÀÖ´Ù. ÇÁ·Î±×·¡¹Ö ¾ð¾î ÀÚü¿¡ ´ëÇÑ ÇÁ·Î±×·¡¹ÖÀ̶ó´Â LispÀÇ Æ¯Â¡Àº ÀÚÀ¯·Î¿î ÇÁ·Î±×·¡¹Ö ½ºÅ¸ÀÏÀ» ¿øÇÏ´Â ÇØÄ¿µéÀÇ ¿ä±¸¸¦ Àß ÃæÁ·½ÃÄÑ Áشٴ °Íµµ ºÎÁ¤ÇÒ ¼ö ¾ø´Â »ç½ÇÀÌ´Ù.
| |
| ´Ü ¸î ȸÀÇ ¿¬Àç·Î CL°ú °°Àº ÇÁ·Î±×·¡¹Ö ¾ð¾î¸¦ Æø³Ð°Ô ´Ù·é´Ù´Â °ÍÀº ¹«¸®ÀÌ´Ù. ¹«¸®ÇÏ¿© Æø³Ð°Ô ´Ù·ç´Ù º¸¸é º°·Î Èï¹Ì·ÓÁö ¸øÇϰųª ½Ç¿ëÀûÀÎ ¸øÇÑ ¿¹ Áß½ÉÀÌ µÇ´Â °æ¿ì°¡ ¸¹°í, µ¶Àڷνᵵ ÀÌ·¸´ÙÇÒ Æ¯º°ÇÑ °æÇèÀ» ÇÏ±â ¾î·Æ´Ù. ÀÌ ±ÛÀº ÁÖ¸¶°£»ê½ÄÀ¸·Î CLÀ» ¼Ò°³Çϱ⺸´Ù´Â CL ÇÁ·Î±×·¡¹ÖÀÇ ÁøÁ¤ÇÑ ¹¦¹Ì¸¦ ´À³¥ ¼ö ÀÖ°Ô Çϴµ¥ ÁßÁ¡À» µÎ·Á°í ÇÑ´Ù. ƯÈ÷ ¿¬ÀçÀÇ 2, 3ȸ¿¡¼´Â Àå³°¨ ¿¹Á¦ À§ÁÖ°¡ ¾Æ´Ñ, ½ÇÁ¦ »ó¾÷¿ë Á¦Ç° °³¹ß¿¡ »ç¿ëµÈ ÇÁ·Î±×·¥À» Áß½ÉÀ¸·Î Àü°³ÇØ ³ª°¥ °ÍÀ̱⠶§¹®¿¡ µ¶ÀÚ ½º½º·Î ¸¹Àº °øºÎ¸¦ ÇÒ °ÍÀ» ¿ä±¸ÇÑ´Ù.
µ¶ÀÚ´Â ±ÛÀ» ÀÐ°í ½º½º·Î ½Ç½ÀÇÏ´Â µµÁß¿¡ »ý±æ ¼ö ÀÖ´Â ¹®Á¦µéÀ» ÀÚÀ²ÀûÀ¸·Î ã¾Æ¼ ÇØ°áÇØ¾ß ÇÑ´Ù. À̶§ °¡Àå µµ¿òÀÌ µÉ Âü°íÀÚ·á°¡ Ä¿¸Õ Lisp ÇÏÀÌÆÛ½ºÆå(Common Lisp HyperSpec, ÀÌÇÏ CLHS)ÀÌ´Ù. CLHS´Â Ansi Common Lisp Ç¥ÁØÀ» ¹ÙÅÁÀ¸·Î XanalysÀÇ Àü½ÅÀÎ Harlequin¿¡¼ ÀÏÇß´ø ÄËÆ® ÇÇÆ®¸Õ(Kent Pitman)ÀÌ ÀÛ¼ºÇÑ HTML ÇüÅÂÀÇ CL Ç¥ÁØ ½ºÆåÀÌ´Ù. CLHS´Â http://www.lispworks.com/reference/HyperSpec/index.html¿¡¼ ´Ù¿î·ÎµåÇϰųª Àо ¼ö ÀÖ´Ù. ¹Ì¸® ½Ã°£ÀÌ ÀÖÀ» ¶§ CLHS°¡ ¾î¶² Çü½ÄÀ¸·Î µÇ¾î ÀÖ´ÂÁö ÆÄ¾ÇÇÒ °ÍÀ» ±ÇÇÑ´Ù. ±× ¿Ü¿¡ ¹ß»ýÇÒ ¼ö ÀÖ´Â ¹®Á¦µéÀº Çѱ¹¸®½À»ç¿ëÀÚ¸ðÀÓ(http://www.lisp.or.kr), ´º½º±×·ì, IRC, Cliki(http://www.cliki.net) µî ÀÎÅÍ³Ý ÀÚ¿øµéÀ» ÅëÇØ ½º½º·Î ÇØ°áÇØ¾ß ÇÒ °ÍÀÌ´Ù.
¹Ì¸® CL °ü·Ã Ã¥µéÀ» Àо´Â °Íµµ ÁÁÀº »ý°¢ÀÌ´Ù. ÀÌ¹Ì ´Ù¾çÇÑ ÆÐ·¯´ÙÀÓÀÇ ÇÁ·Î±×·¡¹Ö ¾ð¾î¸¦ »ç¿ëÇØº» ÇÁ·Î±×·¡¹Ö¿¡ ÀÚ½ÅÀÌ ÀÖ´Â µ¶ÀÚ¶ó¸é Paul GrahamÀÇ ¡®Ansi Common Lisp¡¯À» ¼Óµ¶ÇÒ °ÍÀ» ±ÇÇÑ´Ù. ÇÁ·Î±×·¡¹Ö ¾ð¾î¿¡ ºñ±³Àû »ý¼ÒÇÏÁö¸¸, CLÀÇ ¹¦¹Ì¸¦ ´À²¸º¸°íÀÚ ÇÏ´Â µ¶ÀÚ¶ó¸é David TouretzkyÀÇ ¡®Common Lisp A gentle introduction to symbolic computation¡¯À» ¹Ì¸® Àо °ÍÀ» ±ÇÇÑ´Ù. ±× ¿Ü¿¡µµ CLÀÇ °´Ã¼ÁöÇâ ÇÁ·Î±×·¡¹Ö È®ÀåÀÎ Common Lisp Object System(ÀÌÇÏ CLOS)¿¡ ´ëÇØ¼´Â Sonya E. KeeneÀÇ ¡®Object Oriented Programming in Common Lisp : A Programmer¡¯s Guide to CLOS¡¯¸¦, ÃÖ°í±Þ ¼öÁØÀÇ CL ÇÁ·Î±×·¡¹ÖÀ» ¹è¿ì°íÀÚ ÇÏ´Â µ¶ÀÚ¿¡°Ô´Â Paul GrahamÀÇ ¡®On Lisp(http://www.paulgraham.com/onlisp.html¿¡¼ ´Ù¿î·Îµå)¡¯°ú Peter NorvigÀÇ ¡®Paradigms of Artificial Intelligence Programming : Case Studies in Common Lisp¡¯À» ÃßõÇÑ´Ù. ÀÌ·± Ã¥µéÀº Á¾Á¾ ÀýÆÇµÈ °æ¿ì°¡ Àֱ⠶§¹®¿¡ µµ¼°üÀ̳ª ÀÎÅÍ³Ý µîÀ» Àû±ØÀûÀ¸·Î Ȱ¿ëÇØ¾ß ÇÒ °ÍÀÌ´Ù.
½Ç·Â ÀÖ´Â °³¹ßÀÚ´Â ¾î¶² ÇÁ·Î±×·¡¹Ö ¾ð¾î¿¡ °ü°è¾øÀÌ ÀÏÁ¤ ¼öÁØ ÀÌ»óÀ» À¯ÁöÇÑ´Ù. ¿Ö ±×·²±î? ±×°ÍÀº °³¹ß¿¡ ÀÖ¾î¼ ÇÁ·Î±×·¡¹Ö ¾ð¾î°¡ ÀüºÎ°¡ ¾Æ´Ï±â ¶§¹®ÀÌ´Ù. ÇÊÀÚ´Â ÇÁ·Î±×·¡¹ÖÀº °øÇÐ(Engineering), ±Ô¹ü(Discipline), Ãß»óÈ(Abstraction), ÀÌ ¼ÂÀÇ Á¾ÇÕ ¿¹¼úÀ̶ó°í »ý°¢ÇÑ´Ù. °øÇÐ, ±Ô¹ü, Ãß»óÈ µî¿¡ ½Ç·Â°ú °æÇèÀ» °®°í ÀÖ´Â °³¹ßÀÚ¶ó¸é ¼ø°£ÀûÀ¸·Î Çϳª Á¤µµ °á¿©µÇ¾î ÀÖ´Ù¼Õ Ä¡´õ¶óµµ ³ª¸ÓÁö µÑÀ» Áö·¿´ë·Î ¹öƼ¸é¼ °á¿©µÈ ºÎºÐÀ» ¸Þ¿ï ¼ö ÀÖ´Â ½Ã°£À» ¹ú °ÍÀÌ´Ù.
ÇÁ·Î±×·¡¹Ö ¾ð¾î´Â ƯÈ÷ Ãß»óÈ¿Í °ü°è°¡ ÀÖ´Ù. ½Ç·Â ÀÖ´Â °³¹ßÀÚ°¡ µÇ±â À§Çؼ´Â ÇÁ·Î±×·¡¹Ö ¾ð¾î¸¦ ÀÌ¿ëÇØ ÀûÀýÇÑ Ãß»óȸ¦ À¯ÁöÇÏ¸ç ¹ßÀü½Ãų ¼ö ÀÖ¾î¾ß ÇÑ´Ù(ÇÊÀÚ´Â Ãß»óȰ¡ âÀǼº°ú ¹ÐÁ¢ÇÏ´Ù°í ¹Ï°í ÀÖÀ¸¸ç, Ãß»óȸ¦ ±âÁØÀ¸·Î ÇÁ·Î±×·¡¹ÖÀº ¿¹¼ú¿¡ ´õ °¡±õ´Ù°í »ý°¢ÇÑ´Ù). °³¹ßÀÚ´Â ÇÁ·Î±×·¡¹Ö ¾ð¾î ÀÌ¿ÜÀÇ °³¹ß ȯ°æ, ÇÁ·Î¼¼½º, ¾Ë°í¸®Áò µî ÁַΠå µî°ú °°Àº °£Á¢ °æÇèÀ» ÅëÇØ ¾òÀ» ¼ö ÀÖ´Â °øÇÐÀûÀÎ Ãø¸é¿¡ ´ëÇØ¼µµ ²ÙÁØÈ÷ °è¹ßÇØ¾ß Çϸç, ¹®Á¦ ÇØ°á, ÆÀ¿öÅ©, °í°´ µî ÁÖ·Î Á÷Á¢ÀûÀÎ °æÇè¿¡ ÀÇÇØ ¾ò°Ô µÇ´Â ÀûÀýÇÑ ±Ô¹üÀ» ÁöŰ·Á°í ³ë·ÂÇØ¾ß ÇÑ´Ù.
ÀÌ ¿¬Àç´Â CLÀ» ÀÌ¿ëÇÑ Ãß»óȰ¡ ÁÖÁ¦ÀÌÁö¸¸, CLÀ» Á¦´ë·Î ÀÍÈ÷±â À§Çؼ´Â °øÇÐÀûÀÎ Ãø¸é¿¡ ´ëÇØ¼µµ ¾Ë¾Æ¾ß Çϱ⿡ ÇÊ¿äÇÒ ¶§¸¶´Ù ¾ð±ÞÇÒ ¿¹Á¤ÀÌ´Ù. | | | | | |
| |
Ä¿¸Õ ¸®½À °³¹ß ȯ°æ
ÁÖÀ§¿¡¼ CLÀ» ¹è¿ì±â ½ÃÀÛÇÏ´Â »ç¶÷µéÀ» °üÂûÇÑ ÈÄ ¾òÀº °á·Ð Áß Çϳª´Â CLÀÇ °³¹ß ȯ°æÀº ÇÁ·Î±×·¡¹Ö ¾ð¾î ±× ÀÚü¸¸Å Áß¿äÇÑ µ¥µµ ºÒ±¸Çϰí ÈçÈ÷ °£°úµÈ´Ù´Â »ç½ÇÀÌ´Ù. CL ½Ã½ºÅÛ¿¡ ´ëÇØ µéÀ» ¼ö ÀÖ¾ú´ø ºÒ¸¸µé Áß ´ëºÎºÐÀÌ °³¹ß ȯ°æ¿¡ ´ëÇÑ ÀÌÇØ ºÎÁ·¿¡ ±âÀÎÇÑ °ÍµéÀ̾ú´Ù. CL ÇÁ·Î±×·¡¹ÖÀ» ¹è¿ì°í ÀÍÈ÷´Â °úÁ¤ÀÇ 30% Á¤µµ´Â °³¹ß ȯ°æ¿¡ ´ëÇÑ °ÍÀÓÀ» ÀØÁö ¸»°í ¸í½ÉÇϱ⠹ٶõ´Ù.
Lisp´Â óÀ½¿¡´Â ÀÎÅÍÇÁ¸®ÅÍ ÇüÅ·ΠÁ¸ÀçÇϱ⠽ÃÀÛÇØ¼ ÇöÀç´Â »óÈ£ÀÛ¿ë ½Ã½ºÅÛÀÇ ÇüÅ·Π¹ßÀüÇß´Ù. ƯÈ÷ CLÀÇ »óÈ£ÀÛ¿ë ½Ã½ºÅÛÀº Lisp ¸®½º³Ê(listener), ¿¡µðÅÍ, ÀÎÅÍÇÁ¸®ÅÍ, ÄÄÆÄÀÏ·¯, µð¹ö°Å µîÀÌ À¯±âÀûÀ¸·Î °áÇÕµÇ¾î »ç¿ëÀÚ¿Í ´ëÈÇϵí ÇÏ¸é¼ ÇÁ·Î±×·¥À» °³¹ßÇÒ ¼ö ÀÖµµ·Ï µÇ¾î ÀÖ´Ù. ÀÌ·± »óÈ£ÀÛ¿ë ȯ°æ¿¡¼ ´ÙÀ½°ú ºñ½ÁÇÑ ÁÖ±â·Î ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ´Â °ÍÀÌ º¸ÅëÀÌ´Ù.
[1] ¿¡µðÅÍ¿¡¼ ÇÁ·Î±×·¥ÀÇ ÀϺΠ- À̸¦ Å׸é ÇÔ¼ö Çϳª - ¸¦ ÀÛ¼ºÇÑ´Ù.
[2] ¸®½º³Ê¿¡¼ ÀÛ¼ºÇÑ ÇÔ¼ö Çϳª¸¦ Æò°¡ÇÑ´Ù.
[3] ¸®½º³Ê¿¡¼ ÇÔ¼ö¿¡ ÀÎÀÚ¸¦ ÁÖ°í È£ÃâÇØ ÇÔ¼ö°¡ Á¦´ë·Î ÀÛµ¿ÇÏ´ÂÁö È®ÀÎÇÑ´Ù.
[4] ¸®½º³Ê¿¡¼ ¿¹»óÄ¡ ¸øÇÑ ¿¡·¯¸¦ ¸¸³µÀ» °æ¿ì ÀÚµ¿À¸·Î Ȱ¼ºÈµÇ´Â µð¹ö°Å¸¦ ÅëÇØ ¹®Á¦¸¦ ÆÄ¾ÇÇϰí ÇØ°áÇÑ´Ù.
[5] µð¹ö°Å¿¡¼ ¹®Á¦¸¦ ÆÄ¾ÇÇß´Ù¸é ¿¡µðÅÍ·Î µ¹¾Æ¿Í¼ ±× ¹®Á¦¸¦ ¼öÁ¤ÇÏ°í ´Ù½Ã [1]¢¦[4]ÀÇ °úÁ¤À» ÅëÇØ È®½ÇÈ÷ ¹®Á¦¸¦ ÇØ°áÇÑ ÈÄ ÇÁ·Î±×·¥ÀÇ ÀϺΠȤÀº ÀüºÎ¸¦ ÄÄÆÄÀÏÇØ¼ ¸Þ¸ð¸®¿¡ ÄÄÆÄÀÏµÈ ÇüÅ·ΠÁ¸ÀçÇϵµ·Ï ÇÑ´Ù.
[6] ¿¡µðÅÍ¿¡¼ Çʿ信 µû¶ó ÆÄÀÏÀ» ÀúÀåÇϰųª ÄÄÆÄÀÏÇÑ´Ù.
[7] [1]·Î µ¹¾Æ°¡°Å³ª ÇÁ·Î±×·¡¹ÖÀ» ¸¶Ä£´Ù.
¾ÕÀÇ ÀϵéÀ» Á¦´ë·Î ÇÒ ¼ö ÀÖµµ·Ï µµ¿ÍÁÖ´Â °³¹ß ȯ°æÀÌ µÇ±â À§Çؼ´Â ¿¡µðÅÍ¿Í Lisp ¸®½º³Ê°¡ ¼·Î ¿¬°áµÇ¾î ÇÊ¿äÇÑ Á¤º¸µéÀ» ÁÖ°í¹ÞÀ» ¼ö ÀÖ¾î¾ß ÇÑ´Ù. »ó¾÷¿ë CLÀÇ °æ¿ì ¾ÕÀÇ ÀϵéÀ» ÀÚ¿¬½º·´°Ô ÇÒ ¼ö Àִ ȯ°æÀ» Á¦°øÇÏÁö¸¸, °ø°³ ¼ÒÇÁÆ®¿þ¾î CLµéÀº ±×·¸Áö ¾Ê´Ù. ±×·¸´Ù°í °ø°³ ¼ÒÇÁÆ®¿þ¾î CLÀ» »ç¿ëÇÏ´Â »ç¶÷Àº ¾Õ°ú °°Àº °³¹ß ÁÖ±â·Î ÇÁ·Î±×·¡¹ÖÇÒ ¼ö ¾ø´Ù´Â À̾߱â´Â ¾Æ´Ï´Ù.
Emacs ¿¡µðÅÍ·Î ÇÁ·Î±×·¡¹Ö Áñ±â±â
¸®½À ÇÁ·Î±×·¡¸Óµé¿¡°Ô ¿¡µðÅÍ´Â Emacs ¿ÀÁ÷ Çϳª¸¸ÀÌ Á¸ÀçÇÑ´Ù. »ó¾÷¿ë CLµéÀº °³¹ß ȯ°æÀÇ ÀϺηΠEmacs¿Í À¯»çÇÑ ¿¡µðÅ͸¦ Á¦°øÇϸç, °ø°³ ¼ÒÇÁÆ®¿þ¾î CLµéÀº Emacs¿Í CL ½Ã½ºÅÛÀÌ »óÈ£ÀÛ¿ëÇϵµ·Ï Emacs Lisp(Elisp)À¸·Î ÀÛ¼ºÇÑ ÇÁ·Î±×·¥ÀÎ ILISP(http://sourceforge.net/projects/ilisp)À̳ª Superior Lisp Interaction Mode for Emacs (http://www.common-lisp.net/project/slime/, ÀÌÇÏ SLIME)°ú °°Àº ÆÐŰÁö¸¦ ÀÌ¿ëÇÏ¸é ¾Õ¿¡¼ ¾ð±ÞÇÑ °³¹ß ȯ°æÀ» °®Ãâ ¼ö ÀÖ´Ù. ÀÌ·± ÀÌÀ¯ ¶§¹®¿¡ Emacs ¾ø´Â CL ÇÁ·Î±×·¡¹ÖÀ̶õ »ó»óÇÏ±â ¾î·Æ´Ù.
´Ù¸¥ ¿¡µðÅ͸¦ ÀÌ¿ëÇØ¼ CL ÇÁ·Î±×·¡¹ÖÇÏ´Â °Íµµ ºÒ°¡´ÉÇÑ °ÍÀº ¾Æ´ÏÁö¸¸, ±×·± »ç¶÷µéÀº ¾ó¸¶°¡Áö ¸øÇؼ CL ÇÁ·Î±×·¡¹ÖÀ» Æ÷±âÇÏ°Ô µÈ´Ù. F1 ·¹ÀÌ½Ì Ä«¸¦ ¿îÀüÇϱâ À§Çؼ ÀûÀýÇÑ È¯°æ - À̸¦ Å׸é Àß ±³À°¹ÞÀº ¸ÞÄ«´Ð ÆÀ - ÀÌ ÇÊ¿äÇÑ °Í°ú °°Àº ÀÌÄ¡ÀÌ´Ù(¹°·Ð ±×·± °ÍÀ» ¸ðµÎ °®Ãß¾ú´Ù ÇÏ´õ¶óµµ °æÁÖ¿¡ À̱ä´Ù´Â Àý´ëÀûÀÎ º¸ÀåÀº ¾ø´Ù!).
CLÀ» ÁøÁöÇÏ°Ô ¹è¿ì°íÀÚ ÇÏ´Â »ç¶÷Àº Emacs¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù. óÀ½¿¡´Â ¾à°£ ¾î·Á¿ï Áöµµ ¸ð¸£Áö¸¸, ÇÏ·ç¿¡ Á¶±Ý¾¿ ÀÍÇô³ª°¡¸é ÇÑ´Þ À̳»¿¡ ºÒÆí ¾øÀÌ »ç¿ëÇÒ Á¤µµ´Â µÇ¸®¶ó°í ¹Ï´Â´Ù. Emacs¸¦ °áÄÚ ÀÍÈú ¸¶À½Àº ¾øÁö¸¸ CL ÇÁ·Î±×·¡¹ÖÀ» Çϰڴٴ »ç¶÷Àº ÃÖÈÄÀÇ ¼±ÅÃÀ¸·Î »ó¾÷¿ë CLÀ» ±¸ÀÔÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. »ó¾÷¿ë CLÀÇ ³»Àå ¿¡µðÅÍ´Â Emacs¿¡ ºñÇØ ±â´ÉÀÌ Àû±â ¶§¹®¿¡ ¼³Ä¡ÇÏ´Â µ¥ ÀÖ¾î¼ ¾î·Á¿òµµ °ÅÀÇ ¾ø´Ù. ÇÏÁö¸¸, °è¼Ó CL ÇÁ·Î±×·¡¹Ö ÇÏ´Ùº¸¸é ¾ðÁ¨°¡´Â Emacs¸¦ »ç¿ëÇØ¾ß ÇÒ ³¯ÀÌ ¿Ã °ÍÀ̶ó Àå´ãÇÑ´Ù!
Emacs¸¦ »ç¿ëÇϰí Àְųª ÀÍÈ÷±â·Î °á½ÉÇÑ »ç¶÷À̶ó¸é, CL ÇÁ·Î±×·¡¹Ö¿¡ »ç¿ëÇÒ ÆÐŰÁöÀÎ ILISPÀ̳ª SLIMEÀ» ¼³Ä¡ÇØ¾ß ÇÑ´Ù. ILISPÀº ¿À·§µ¿¾È ´Ü Çϳª»ÓÀÎ CL ÇÁ·Î±×·¡¹Ö¿ë Emacs ÆÐŰÁö·Î Á¸ÀçÇß¾úÁö¸¸, ÄÚµåÀÇ ÁúÀÌ ÀúÇÏµÇ¾î ´õ ÀÌ»ó ¿øÈ°ÇÑ À¯Áöº¸¼ö°¡ ÀÌ·ïÁöÁö ¾Ê°í ÀÖÀ¸¸ç, SLIMEÀº ILISPÀ» ´ëÄ¡Çϰڴٴ ¾ß½É(?)À¸·Î ºñ±³Àû ÃÖ±Ù¿¡ ½ÃÀÛµÇ¾î °³¹ßÀÌ È°¹ßÈ÷ ÁøÇàµÇ°í ÀÖ´Ù.
ÇÊÀÚÀÇ ÆÀÀº »ó¾÷¿ë CL°ú °ø°³ ¼ÒÇÁÆ®¿þ¾î CLÀ» »ç¿ëÇÏ¸é¼ ÆÀ³» ¸ðµç °³¹ßÀÚµéÀÌ Emacs + SLIME À̶ó´Â µ¿ÀÏÇÑ °³¹ß ȯ°æÀ» »ç¿ëÇϰí ÀÖ´Ù. ÇÊÀÚÀÇ ÆÀ¿¡¼ Àü¿ë °³¹ß ȯ°æÀÌ Á¦°øµÇ´Â »ó¾÷¿ë CLÀ» ÀÌ¿ëÇØ ÇÁ·Î±×·¡¹ÖÇÒ ¶§µµ Àü¿ë °³¹ß ȯ°æÀ» »ç¿ëÇÏÁö ¾Ê´Â ÀÌÀ¯´Â ƯÁ¤ CL·ÎºÎÅÍ µ¶¸³ÀûÀÎ °³¹ß ȯ°æÀ» ¿øÇϱ⠶§¹®ÀÌ´Ù. ÀÌ·¸°Ô µÇ¸é CLÀÇ ±¸ÇöÀ» ¹Ù²Ù´õ¶óµµ ÀÌÀü°ú ´Ù¸§¾ø´Â »ý»ê¼ºÀ» À¯ÁöÇÒ ¼ö ÀÖ´Ù. ¹°·Ð ¶§¶§·Î GUI, ÇÁ·ÎÆÄÀÏ µîÀÌ ÇÊ¿äÇÑ °æ¿ì Àü¿ë °³¹ß ȯ°æÀ» ÀÌ¿ëÇϱ⵵ ÇÏÁö¸¸ ´ÙÇàÈ÷µµ ±×·± ÀϵéÀº ÀÚÁÖ ÀϾÁö ¾Ê´Â´Ù. ±¹³»¿¡µµ Emacs °ü·Ã »çÀÌÆ®(http://emacs.kldp.org/wiki/wiki.php)°¡ ÀÖÀ¸¹Ç·Î Emacs¸¦ ¹è¿ï ¶§ Àû±Ø Ȱ¿ëÇϱ⠹ٶõ´Ù.
Emacs¿Í SLIMEÀ» ¼³Ä¡Çß´Ù¸é, ´ÙÀ½ ¿¹¿Í ºñ½ÁÇÏ°Ô .emacs ¼³Á¤ ÆÄÀÏÀ» ÆíÁýÇÑ´Ù. ±¸Ã¼ÀûÀÎ µð·ºÅ丮³ª °æ·Î´Â ´Ù¸¦ ¼ö ÀÖÀ¸¹Ç·Î ÇÁ·Î±×·¥À̳ª µ¥ÀÌÅÍ ¼³Ä¡ ÈÄ È®ÀÎÇÏ¿© ¼öÁ¤ÇØ¾ß ÇÒ °ÍÀÌ´Ù. °³¹ß ȯ°æ¿¡¼ CLHS¸¦ SLIMEÀÇ ´ÜÃà۸¦ ÅëÇØ ¹®¸Æ(context)¿¡ ¸Â°Ô ÂüÁ¶Çϱâ À§Çؼ´Â ¡°common-lisp-hyperspec-root¡±¸¦ CLHSÀÇ ·çÆ® µð·ºÅ丮·Î ¼³Á¤ÇØ¾ß ÇÑ´Ù. ¡°inferior-lisp-program¡±Àº ÀÚ½ÅÀÌ »ç¿ëÇÒ CL ±¸Çö ½ÇÇà ÆÄÀÏ·Î ¼³Á¤ÇØ¾ß ÇÑ´Ù.
(custom-set-variables
;; ¿©·¯ °¡Áö »ö±òÀ» ÀÌ¿ëÇÏ¿© ÇÁ·Î±×·¡¹ÖÀÌ ¿ëÀÌÇϵµ·Ï ÆùÆ®¶ô ¸ðµå¸¦ Ȱ¼ºÈÇÑ´Ù.
'(global-font-lock-mode t nil (font-lock)))
;; °ýÈ£ÀÇ ¿°í ´ÝÀ½À» ´«À¸·Î È®ÀÎÇÒ ¼ö ÀÖ°Ô ÇØÁÖ´Â Lisp ÇÁ·Î±×·¡¹Ö¿¡ ÇʼöÀûÀÎ ¸ðµå
(show-paren-mode)
;;; Slime ¼Â¾÷
(add-to-list 'load-path "~/dev-tools/site-lisp/slime")
(require 'slime)
(add-hook 'lisp-mode-hook (lambda () (slime-mode t)))
(add-hook 'inferior-lisp-mode-hook (lambda () (inferior-slime-mode t)))
;;; Apple Darwin ?
(defun powerpc-apple-darwin? ()
(search "powerpc-apple-darwin" system-configuration))
;;; Intel Linux ?
(defun i386-linux? ()
(and (search "i386" system-configuration)
(search "linux" system-configuration)))
;;; Platform dependent setup - CLHS¿Í SBCL
(cond ((i386-linux?)
(setq common-lisp-hyperspec-root "file:/usr/share/doc/hyperspec/"
inferior-lisp-program "/usr/local/bin/sbcl"))
((powerpc-apple-darwin?)
(setq common-lisp-hyperspec-root "file:////Applications/MCL/HyperSpec-6-0 Folder/HyperSpec/"
browse-url-browser-function
(lambda (url &optional new-window)
(message url)
(do-applescript (concat "tell application \"Safari\" to open location \""
url "\"")))
inferior-lisp-program "/usr/local/bin/sbcl")))
(add-hook 'lisp-mode-hook
(lambda ()
(set (make-local-variable 'lisp-indent-function) 'common-lisp-indent-function)))
Ä¿¸Õ ¸®½À ±¸Çö
ÀüÇüÀûÀÎ CL ±¸ÇöÀº ANSI Ç¥ÁØ¿¡¼ Á¤ÀÇµÈ ºÎºÐ°ú ±×·¸Áö ¾ÊÀº ºÎºÐÀ¸·Î ÀÌ·ïÁø´Ù. ´ë°³ÀÇ °æ¿ì Ç¥ÁØ ºÎºÐÀº CLHS¸¦, ºñÇ¥ÁØ ºÎºÐÀº °¢ CLÀÇ ¹®¼¸¦ Âü°íÇØ ÆÄ¾ÇÇØ¾ß ÇÑ´Ù. ºñÇ¥ÁØ ºÎºÐ¿¡ ´ëÇØ¼´Â ÀûÀýÇÑ ¹®¼°¡ ¾ø´Â °æ¿ìµµ Àִµ¥, ÀÌ·± °æ¿ì¿¡´Â ÇØ´ç CLÀÇ »ç¿ëÀÚ ±×·ìÀ̳ª ¸ÞÀϸµ ¸®½ºÆ®¸¦ ÅëÇØ µµ¿òÀ» ¹Þ´Â °ÍÀÌ º¸ÅëÀÌ´Ù.
Ç¥ÁØÀº ¾Æ´ÏÁö¸¸ ´ëºÎºÐÀÇ CL¿¡¼ Áö¿øÇÔÀ¸·Î½á »ç½Ç»óÀÇ Ç¥ÁØÀ¸·Î Ãë±ÞÇÏ´Â °Íµµ Àִµ¥, ¿¹¸¦ µé¸é MetaObject Protocol(ÀÌÇÏ MOP)ÀÌ ±×·¯ÇÏ´Ù. MOPÀº Aspect Programming, AspectJ µîÀ¸·Î ³Î¸® ¾Ë·ÁÁø Gregor Kiczales¸¦ ÁÖÃàÀ¸·Î Á¦¾ÈµÇ¾ú´ø CLOSÀÇ È®ÀåÀÌ´Ù. MOPÀº Ç¥ÁØÀÌ ¾Æ´Ï±â ¶§¹®¿¡ »ç¿ëÇϰíÀÚ ÇÏ´Â »ç¶÷Àº Gregor KiczalesÀÇ ¡®The Art of Metaobject Protocol(ÀÌÇÏ AMOP)¡¯À» Âü°íÇØ¾ß ÇÑ´Ù.
ºñÇ¥ÁØÀÎ ºÎºÐÀº ´ë°³ÀÇ °æ¿ì °èÃþÈµÈ º°µµÀÇ ¼ÒÇÁÆ®¿þ¾î(layered product)ÀÎ °æ¿ì¿Í ÇÏÀ§ ¼öÁØ ±¸Çö¿¡ ÀÇÁ¸¼ºÀÌ ÀÖ´Â °æ¿ì°¡ ºó¹øÇÏ´Ù. ÀüÀÚ´Â ´Ù¸¥ ÇÁ·Î±×·¡¹Ö ¾ð¾î¿¡¼´Â ¶óÀ̺귯¸® ÇüÅÂ¿Í À¯»çÇϸç, ÈÄÀÚ´Â CLÀ» ±¸ÇöÇÑ °³¹ßÀÚ³ª ȸ»ç°¡ ÃßÈÄ º¯°æÀ» À§ÇØ ÀÏ¹Ý ÇÁ·Î±×·¡¸ÓµéÀº »ç¿ëÇÏÁö ¾Ê¾ÒÀ¸¸é ÇÏ´Â °æ¿ì°¡ ´ëºÎºÐÀÌ´Ù.
CL ½Ã½ºÅÛ(¾ÕÀ¸·Î CL ÇÁ·Î±×·¡¹Ö ¾ð¾î ÀÚü»Ó ¾Æ´Ï¶ó CL ±¸ÇöµéÀ» ¡®CL ÇÁ·Î±×·¡¹Ö ¾ð¾î ½Ã½ºÅÛ¡¯ ȤÀº °£´ÜÈ÷ ¡®CL ½Ã½ºÅÛ¡¯À̶ó°í ĪÇÑ´Ù)Àº ¿À·£ ½Ã°£µ¿¾È ½° ¾øÀÌ ²ÙÁØÈ÷ º¯ÈÇØ ¿Ô±â ¶§¹®¿¡ Áö±ÝÀº ¾µ¸¸ÇÑ ½Ã½ºÅÛµéÀÌ ²Ï Á¸ÀçÇÑ´Ù. À©µµ¿ì, ¸®´ª½º, ¸Æ, À¯´Ð½º µî¿¡¼ µ¿ÀÛÇÏ´Â »ó¾÷¿ë ¹× °ø°³ ¼ÒÇÁÆ®¿þ¾î CL ½Ã½ºÅÛµéÀÌ ÀÖ´Ù. »ó¾÷¿ë CL ½Ã½ºÅÛµéÀº ´ëºÎºÐ À©µµ¿ì, ¸®´ª½º, ¸Æ, À¯´Ð½º µîÀÇ OS¿¡¼ °ø°³ ¼ÒÇÁÆ®¿þ¾î CL ½Ã½ºÅÛµéÀº ±×µé Áß ÀϺο¡¼ µ¿ÀÛÇÏ´Â °ÍÀÌ º¸ÅëÀÌ´Ù. °ø°³ ¼ÒÇÁÆ®¿þ¾î CL ½Ã½ºÅÛ Áß ¸î¸î(¿¹¸¦ µé¸é ¸Æ¿ëÀÎ OpenMCL)Àº »ó¾÷¿ë¿¡ ¹ö±Ý°¡´Â ÁúÀ» À¯ÁöÇϰí ÀÖ´Ù°í ÇÑ´Ù.
»ó¾÷¿ë CL ½Ã½ºÅÛÀ¸·Î´Â DigitoolÀÇ Macintosh Common Lisp, FranzÀÇ Allegro Common LispÀ̳ª XanalysÀÇ LispWorks(ÀÌÇÏ LW) µîÀÌ °¡Àå ³Î¸® »ç¿ëµÇ°í ÀÖ´Ù. °ø°³ ¼ÒÇÁÆ®¿þ¾î CL·Î´Â CLISP, Carnegie Mellon University Common Lisp(ÀÌÇÏ CMUCL), OpenMCL, Steel Bank Common Lisp(ÀÌÇÏ SBCL) µîÀÌ ÀÖÀ¸¸ç, OpenMCLÀº ¸Æ¿¡¼, ³ª¸ÓÁö´Â ¸®´ª½º³ª À¯´Ð½º µî¿¡¼ µ¿ÀÛÇÑ´Ù. ±× ¿Ü¿¡µµ ¸î °³ÀÇ ±¸ÇöÀÌ Á¸ÀçÇÏÁö¸¸ ÁúÀûÀ¸·Î ¶³¾îÁö´Â °ÍµéÀÌ ´ëºÎºÐÀÌ´Ù. Cliki(http://www.cliki.net/Common%20Lisp%20implementation)¿¡¼ ¸¹ÀÌ »ç¿ëµÇ°í ÀÖ´Â CL ±¸Çö¿¡ ´ëÇØ º¸´Ù ÀÚ¼¼È÷ ¾Ë ¼ö ÀÖ´Ù.
»ó¾÷¿ë°ú ¿ÀÇ ¼ÒÇÁÆ®¿þ¾î CL ½Ã½ºÅÛ »çÀÌÀÇ °¡Àå Å« Â÷ÀÌ´Â »ç¿ëÀÚ¿¡ ´ëÇÑ ¹è·Á¿Í Áö¿øÀÌ´Ù. »ó¾÷¿ëÀº °æ°í³ª ¿¡·¯ ¸Þ½ÃÁö, µð¹ö±ë µî¿¡ ÇÊ¿äÇÑ ³»¿ë µîÀÌ ¿ÀǼҽº¿¡ ºñÇØ ÀÚ¼¼Çϰí Ä£ÀýÇϱ⠶§¹®¿¡ ºÒÇÊ¿äÇÑ ½Ã°£ ³¶ºñ¸¦ ÃÖ¼ÒÈÇØ ÁØ´Ù. ¶Ç Á÷Á¢ ȤÀº °£Á¢ÀûÀÎ Áö¿øÀ¸·Î °³¹ßÀÚ°¡ ÀÚ½ÅÀÌ Ã³ÇÑ ¹®Á¦ ÀÚü¿¡¸¸ ÁýÁßÇÒ ¼ö ÀÖµµ·Ï µµ¿ÍÁØ´Ù. ºñ»ó¾÷¿ëÀÎ °æ¿ì¿¡´Â Á¾Á¾ ÀÚ½ÅÀÇ ¹®Á¦°¡ ¾Æ´Ñ CL ½Ã½ºÅÛ ÀÚü ¹®Á¦¿¡ ´ëÇØ ½º½º·Î ÇØ°áÃ¥À» ã¾Æ³»¾ß ÇÑ´Ù. ÇÊÀÚÀÇ °æ¿ì, ÀÌÀü¿¡ º¹ÀâÇÑ ½Ã½ºÅÛÀ» °³¹ßÇÒ ´ç½Ã ¿©·¯ ¹ø ºü¸£°í Á¤È®ÇÑ ±â¼úÁö¿øÀ» °æÇèÇ߱⠶§¹®¿¡ ´ç¿¬È÷ »ó¾÷¿ëÀ» ¼±È£ÇÏÁö¸¸, ¶§¶§·Î °æÁ¦ÀûÀÎ ÀÌÀ¯¿¡¼ ¾î¿ ¼ö ¾øÀÌ ºñ»ó¾÷¿ëÀ» »ç¿ëÇØ¾ß ÇÒ °æ¿ìµµ ÀÖ´Â °ÍÀÌ Çö½ÇÀÌ´Ù.
¾Õ¿¡¼ ³ª¿ÇÑ »ó¾÷¿ë CL ½Ã½ºÅÛµéÀº ´ëü·Î ¸ðµÎ ¼º´É°ú Áö¿øÀÌ ÁÁÀº °ÍÀ¸·Î ¾Ë·ÁÁ® ÀÖ´Ù. ºñ»ó¾÷¿ëÀÇ °æ¿ì CMUCLÀÌ ¼öÇÐ ºÐ¾ß¿¡¼ÀÇ ÃÖÀûÈ´Â ´Ù¸¥ ¾î¶² CLº¸´Ù ¶Ù¾î³ °ÍÀ¸·Î ¾Ë·ÁÁ® ÀÖ°í, SBCLÀº CMUCLÀ» ¹ÙÅÁÀ¸·Î ´õ ³ªÀº ÄÚµåÀÇ ÁúÀ» ¸ñÇ¥·Î °³¹ßµÇ°í ÀÖÀ¸¸ç, OpenMCLÀº ¸Æ¿¡¼ µ¶º¸ÀûÀÎ Á¸ÀçÀ̸ç, CLISPÀº »ç¿ëÇϱ⿡ ¹«³ÇÑ °ÍÀ¸·Î ¾Ë·ÁÁ® ÀÖ´Ù. ÇÊÀÚ°¡ ´À³¢±â¿¡ °³¹ß»ç³ª »ç¿ëÀÚµéÀÇ È°µ¿ÀÌ È°¹ßÇÑ CL ½Ã½ºÅÛµéÀº Allegro Common Lisp, LW, OpenMCL, SBCL µîÀÌ´Ù. ÇÊÀÚÀÇ ÆÀ¿¡¼´Â ÇϳªÀÇ CL¿¡ ÀÇÁ¸ÇÏÁö ¾Ê±â À§Çؼ LW¿Í SBCLÀ» °³¹ß¿ë CL·Î »ç¿ëÇϰí ÀÖ´Ù. ¼±Åà ±âÁØÀº LWÀÇ °æ¿ì ºñ±³Àû Àú·ÅÇÑ °¡°Ý°ú ºü¸£°í Ä£ÀýÇÑ Áö¿øÀ̰í, SBCLÀº °ø°³ ¼ÒÇÁÆ®¿þ¾î CL·Î¼ÀÇ ¹ßÀü °¡´É¼ºÀÌ´Ù(¾Æ¸¶µµ SBCLÀÌ ¾Æ´Ï¾ú´Ù¸é CMUCLÀ» ¼±ÅÃÇßÀ» °ÍÀÌ´Ù).
¾ÕÀ¸·Î ´Ù·ê ¿¹µéÀº ÇÊÀÚÀÇ ÆÀ¿¡¼ °³¹ß ÁßÀÎ »ó¾÷¿ë ¼ºñ½ºÀÇ ÀϺημ µ¥ºñ¾È ¸®´ª½º, LW¿Í SBCL, ¾ÆÆÄÄ¡ À¥ ¼¹ö µîÀ» »ç¿ëÇØ °³¹ß ÁßÀÎ °ÍÀÌ´Ù. ÄÚµå ÀÚü´Â ÃÖ´ëÇÑ Ç¥ÁØ CL¸¸À» »ç¿ëÇÏ·Á°í ÇÏ¿´Áö¸¸, ¾î¿ ¼ö ¾øÀÌ Multi Process(ȤÀº ¾²·¹µå), ¿ÜºÎ ÇÔ¼ö È£ÃâºÎ(Foreign Function Interface), ³í¸®Àû °æ·Î¸í µî°ú °°Àº ÇÏÀ§ Ãþ¿¡ ÀÇÁ¸¼º ÀÖ´Â ºñÇ¥ÁØ ºÎºÐÀ» »ç¿ëÇÏ´Â °æ¿ì°¡ ¹ß»ýÇß´Ù. ´Ù¸¥ ±¸¼ºÀ¸·Î µ¿ÀÛÇÏ°Ô ÇÏ´Â ÀÏÀÌ ºÒ°¡´ÉÇÏÁö´Â ¾ÊÁö¸¸, ¾µµ¥¾ø´Â ½Ã°£³¶ºñ¸¦ ÁÙÀ̱â À§Çؼ µ¶ÀÚ´Â ¸®´ª½º, LW ȤÀº SBCL, ¾ÆÆÄÄ¡ µî°ú À¯»çÇÑ ±¸¼ºÀ» °®Ãâ °ÍÀ» ±ÇÇÑ´Ù.
CL ½Ã½ºÅÛ ¼³Ä¡
CL ½Ã½ºÅÛ ¼³Ä¡¿¡ ´ëÇØ¼´Â ÀÚ½ÅÀÌ »ç¿ëÇÒ CL ½Ã½ºÅÛÀÇ ¹®¼¸¦ ÁÖ·Î ÂüÁ¶ÇØ¾ß ÇÑ´Ù. ±× ¿Ü¿¡µµ Çѱ¹Lisp»ç¿ëÀÚ¸ðÀÓ µîÀ» ÅëÇØ µµ¿òÀ» ¹ÞÀ» ¼öµµ ÀÖÀ» °ÍÀÌ´Ù. LWÀÇ °æ¿ì ±¸ÀԽà ÇÔ²² ¿À´Â ¼³¸í¼¸¦ ÂüÁ¶ÇØ ¼³Ä¡ÇÏ¸é µÇ°í, ¹®Á¦°¡ ¹ß»ýÇÑ´Ù ÇÏ´õ¶óµµ ÆÇ¸Åó·ÎºÎÅÍ Áö¿øÀ» ¹ÞÀ» ¼ö ÀÖÀ¸¹Ç·Î º°´Ù¸¥ ¾î·Á¿òÀÌ ¾øÀ» °ÍÀÌ´Ù. ÇÊÀÚ°¡ °³¹ß¿¡ »ç¿ëÇÏ´Â ¹öÀüÀº 4.3+ ÆÐÄ¡ ¹öÀüÀÎ 4.3.7ÀÌ´Ù.
SBCLÀº °³¹ß »çÀÌÆ®(http://sourceforge.net/projects/sbcl)¿¡¼ ´Ù¿î¹Þ¾Æ ¼³Ä¡ÇÒ ¼ö ÀÖ´Ù. ¼³Ä¡½Ã ÁÖÀÇ»çÇ×Àº ÀÌ¹Ì ÀÚ½ÅÀÇ ½Ã½ºÅÛÀÌ SBCLÀ» ÄÄÆÄÀÏÇÒ ¼ö ÀÖ´Â CLÀÌ ¾ø´Â °æ¿ì¿¡´Â ¹ÙÀ̳ʸ®¸¦ ´Ù¿î¹Þ¾Æ¾ß ÇÑ´Ù´Â Á¡ÀÌ´Ù(SBCL ¼Ò½ºÄÚµå´Â CL·Î ÄÄÆÄÀÏÇÑ´Ù). SBCLÀº °è¼Ó °³¹ßÀÌ ÁøÇà ÁßÀ̱⠶§¹®¿¡ ¹öÀü¿¡ µû¶ó »óÀÌÇÑ °á°ú¸¦ ¾ò´Â °æ¿ì°¡ ÀÖÀ» ¼ö ÀÖ´Ù. ÇÊÀÚÀÇ ÆÀ¿¡¼´Â ¿ÜºÎ ÇÔ¼ö È£ÃâºÎÀÇ ¶óÀ̺귯¸® ·Îµù ºÎºÐÀÌ ¹öÀü¸¶´Ù ´Þ¶ó¼ ¹®Á¦°¡ µÈ °æ¿ì°¡ ÀÖ¾ú°í, ¾Ë ¼ö ¾ø´Â ¿øÀÎÀ¸·Î ÀϺΠ±â´ÉÀÌ Á¦¿ÜµÈ ä ºôµåµÈ °ÍÀ» ¸ð¸£°í ¹Ý³ªÀýÀ» °í»ýÇÑ °æÇèÀÌ ÀÖ´Ù. ÇÊÀÚÀÇ ÆÀ¿¡¼´Â SBCL ¹öÀü 0.8.10À» »ç¿ëÇÏ´Ù°¡ ¾ó¸¶ Àü 0.8.13À¸·Î ¾÷±×·¹À̵åÇß´Ù. LW ȤÀº SBCLÀ» ¼³Ä¡ÇÑ ÈÄ¿¡´Â ÃʱâÈ ÆÄÀÏÀ» ´ÙÀ½ ¿¹¸¦ ÂüÁ¶ÇØ ¼³Á¤ÇÑ´Ù.
;;;; -*- Mode: lisp; Package: cl-user; Syntax: Common-lisp -*-
;;
;; Copyright (C) 2004 Jong-won Choi, Jiwon Seo, and Young-hoo Kim
;; All rights reserved.
;;
;; Author: $Author: kmp $
;; Version: $Id: .sbclrc,v 1.21 2004/07/26 01:11:04 kmp Exp $
(in-package :cl-user)
;;; NOTE: °æ·Î¸íÀ» ÀûÀýÇÏ°Ô ¹Ù²Ü °Í
(require "asdf" (merge-pathnames "kmp/cclan/asdf/asdf" (user-homedir-pathname)))
;;; ÁÖ¾îÁø °æ·Î¸íÀÌ ÆÄÀÏ À̸§À̸é Âü(T), ¾Æ´Ï¸é °ÅÁþ(NIL)À» ¸®ÅÏÇÏ´Â ÇÔ¼ö
(defun file? (pathname)
(let ((string-name (namestring pathname)))
(if (char= #\/ (aref string-name (1- (length string-name))))
nil
t)))
;;; ASDF »ç¿ëÀ» À§ÇÑ À¯Æ¿¸®Æ¼ ÇÔ¼ö
;;; ÁÖ¾îÁø °æ·Î¿¡¼ ASDF ½Ã½ºÅÛ Á¤ÀÇ ÆÄÀÏÀ» ¹ß°ßÇϸé ASDF¿¡ µî·ÏÇϰí
;;; (*central-registry*), ¼ºê µð·ºÅ丮¿¡ ´ëÇØ Àç±ÍÀûÀ¸·Î ASDF¿¡ µî·Ï ½Ãµµ
(defun build-asdf-central-registry (path)
(unless (file? path)
(let ((asd-file (directory (merge-pathnames "*.asd" path))))
(when asd-file
(push path asdf:*central-registry*))
(let ((sub-directories (directory (merge-pathnames "*.*" path))))
(when sub-directories
(map nil #'build-asdf-central-registry sub-directories))))))
;; local °³¹ß µð·ºÅ丮ÀÎ ~/kmp¿¡ ´ëÇØ Àç±ÍÀûÀ¸·Î ASDF µî·Ï
(build-asdf-central-registry (merge-pathnames "kmp/" (user-homedir-pathname)))
Emacs¿Í CL ½Ã½ºÅÛÀÇ ¼³Á¤À» ¸¶Ä£ ÈÄ Emacs¸¦ ½ÇÇà½Ã۰í, ¡®M-x slime¡¯À» ÅëÇØ CL ½Ã½ºÅÛÀ» ½ÃÀÛÇØ¼ ¾ÕÀ¸·Î ´ÙÀ½ ¿¬Àç±îÁö 1°³¿ù°£ CL ÇÁ·Î±×·¡¹Ö ¿¬½ÀÀ» ÇØµÎ±â ¹Ù¶õ´Ù.
Ä¿¸Õ ¸®½ÀÀ» À§ÇÑ ¶óÀ̺귯¸®
¼ÒÇÁÆ®¿þ¾î¸¦ °³¹ßÇϴµ¥ ¸ðµç °ÍÀ» ÀÚü °³¹ßÇÏ´Â °æ¿ì´Â ´õ ÀÌ»ó ã¾Æº¸±â Èûµé´Ù. ÀÌ °°Àº Ãß¼¼´Â CL ÇÁ·Î±×·¡¹Ö¿¡¼µµ ¿¹¿Ü´Â ¾Æ´Ï´Ù. CLÀÇ ¶óÀ̺귯¸® ¸ðµ¨Àº °£´ÜÇÏ´Ù. ÃÖÁ¾ Á¦Ç°À¸·Î½áÀÇ ¼ÒÇÁÆ®¿þ¾î´Â Ç×»ó CL ½Ã½ºÅÛÀ» Æ÷ÇÔÇÑ´Ù. ¿øÇÑ´Ù¸é ÃÖÁ¾ Á¦Ç°¿¡ ÄÄÆÄÀÏ·¯¸¦ ³¢¿ö³Ö¾î ·±Å¸ÀÓ¿¡ »ç¿ëÇÒ ¼öµµ ÀÖ´Ù(»ó¾÷¿ë CL ½Ã½ºÅÛÀº ´Ù¸¥ ÇÁ·Î±×·¡¹Ö ¾ð¾î ½Ã½ºÅÛº¸´Ù °¡°ÝÀÌ ºñ½Ñ ÀÌÀ¯ Áß ÇϳªÀÌ´Ù). °³¹ß ÁßÀÎ ½Ã½ºÅÛ¿¡¼ Ç¥ÁØ ÀÌ¿ÜÀÇ ¶óÀ̺귯¸®¸¦ »ç¿ëÇÑ´Ù¸é ¿øÇÏ´Â ¶óÀ̺귯¸®¸¦ CL ½Ã½ºÅÛÀ¸·Î ·ÎµåÇÏ¸é µÈ´Ù.
Àá±ñ ÁÖÁ¦¸¦ ¹þ¾î³ª¼ CL ½Ã½ºÅÛ¿¡¼ ¾î¶»°Ô ÃÖÁ¾ÀûÀÎ Á¦Ç°À» Á¦ÀÛÇÏ´ÂÁö »ìÆìº¸±â·Î ÇÏÀÚ. °³¹ßÇÏ´Â µ¿¾ÈÀº »ó¾÷¿ëÀ̳ª °ø°³ ¼ÒÇÁÆ®¿þ¾î CL ½Ã½ºÅÛÀ̳ª °ÅÀÇ À¯»çÇÏ´Ù. ¼Ò½ºÄڵ带 ¸ðµÎ ÄÄÆÄÀÏÇÏ°í ·ÎµåÇÑ ÈÄ ¸ÞÀÎ ÇÔ¼ö¸¦ ½ÇÇàÇÏ¸é ¾ÖÇø®ÄÉÀ̼ÇÀÌ µ¿ÀÛÇϱ⠽ÃÀÛÇÑ´Ù. °³¹ßÀ» ³¡¸¶Ä¡¸é ÄÄÆÄÀÏµÈ ÆÄÀϵéÀ» ¼ø¼´ë·Î ·ÎµåÇÑ ÈÄ ¸ÞÀÎ ÇÔ¼ö¸¦ È£ÃâÇÏ´Â CL ¼Ò½ºÄÚµå ÆÄÀÏÀ» Çϳª ÀÛ¼ºÇØ ÄÄÆÄÀÏµÈ ÆÄÀϵé°ú ÇÔ²² ¹èÆ÷ÇÏ´Â °ÍÀÌ º¸ÅëÀÌ´Ù. ÇÏÁö¸¸ ¶§¶§·Î ÇϳªÀÇ ¹ÙÀ̳ʸ® À̹ÌÁö ÆÄÀÏ ÇüÅ·Π¹èÆ÷ÇÒ Çʿ䰡 ÀÖ´Ù. °ø°³ ¼ÒÇÁÆ®¿þ¾î CL ½Ã½ºÅÛÀº ÀÌ ºÎºÐ¿¡ ´ëÇÑ Æ¯º°ÇÑ °úÁ¤À̳ª ±â´ÉÀÌ ¾ø´Ù. »ó¾÷¿ë CL ½Ã½ºÅÛÀº À̿ʹ ´Þ¸® µô¸®¹ö¸®(delivery)¶ó´Â °úÁ¤ÀÌ ÀÖ¾î¼ ¿Ï¼ºµÈ ÇÁ·Î±×·¥À» ÃÖÀûÈÇÏ¿© »ç¿ëÇÏÁö ¾Ê´Â ¶óÀ̺귯¸® ÇÔ¼öµéÀ» Á¦°ÅÇϰí È£ÃâÇÒ ¸ÞÀÎ ÇÔ¼ö¸¦ ¼ÂÆÃÇØ¼ ¹Ù·Î ½ÇÇà °¡´ÉÇÑ ÇϳªÀÇ ¹ÙÀ̳ʸ® ÆÄÀÏÀ» ¸¸µé¾î ³»´Â °ÍÀÌ °¡´ÉÇÏ´Ù.
ÇÊÀÚÀÇ ÆÀ¿¡¼ °³¹ßÇÏ´Â Á¦Ç°Àº ¸î °¡Áö CL¿ë °ø°³ ¼ÒÇÁÆ®¿þ¾î ¶óÀ̺귯¸®¸¦ »ç¿ëÇÑ´Ù. °¡Àå Áß¿äÇÏ´Ù°í ²ÅÀ» ¼ö ÀÖ´Â °ÍµéÀÌ ¾ÆÆÄÄ¡ À¥ ¼¹ö µÚ¿¡¼ ¸ðµç ÀÏÀ» ÇÏ´Â CL À¥ ¼¹ö¸¦ ½±°Ô ¸¸µé ¼ö ÀÖµµ·Ï ÇØÁÖ´Â TBNL°ú CL¿¡¼ RDB¸¦ »ç¿ëÇÒ ¼ö ÀÖ°Ô ÇØÁÖ´Â CLSQLÀÌ´Ù. µÑ ´Ù Ȱ¹ßÈ÷ °³¹ßµÇ°í ÀÖÀ¸¸ç, ¼Ò½ºÄÚµåÀÇ Áúµµ ²Ï ³ôÀº ÆíÀÌ´Ù. TBNLÀº http://www.weitz.de/tbnl/¿¡¼, CLSQLÀº http://clsql.b9.com/¿¡¼ ´Ù¿î·ÎµåÇϰųª Âü°íÀڷḦ ÀÐÀ» ¼ö ÀÖ´Ù.
ÇÁ·Î±×·¡¹Ö °èȹ
¿¬À縦 ÅëÇØ ´Ù·ê CL ÇÁ·Î±×·¡¹Ö ¿¹¸¦ ¼³¸íÇϱâ À§Çؼ´Â ÇöÀç ÇÊÀÚÀÇ ÆÀ¿¡¼ ¼öÇàÇϰí ÀÖ´Â ÇÁ·ÎÁ§Æ®¿¡ ´ëÇÑ ¼³¸íÀÌ ¾à°£ ÇÊ¿äÇÏ´Ù. ÇöÀç °³¹ß ÁßÀÎ ½Ã½ºÅÛÀº ¡®ÇÁ·ÎÁ§Æ® KMP¡¯·Î, À¥ ±â¹Ý ¡®IT ºÐ¾ß Áö½Ä °Å·¡ Ä¿¹Â´ÏƼ¡¯ ¼ºñ½º¿ë ½Ã½ºÅÛÀÌ´Ù. KMP´Â À¥ ¼ºê½Ã½ºÅÛ, RDB ¼ºê½Ã½ºÅÛ, ±×¸®°í ¼ºñ½ºÀÇ Á᫐ ¿ªÇÒÀÎ KMP °´Ã¼Ãþ µîÀ¸·Î ÀÌ·ïÁ® ÀÖ´Ù. À¥Àº KMP °´Ã¼µéÀ» À§ÇÑ ÇÁ¸®Á¨Å×ÀÌ¼Ç °èÃþÀ̰í, RDB´Â KMP °´Ã¼µé¿¡°Ô ¿µ¼Ó¼ºÀ» ºÎ¿©Çϱâ À§ÇÑ °èÃþÀÌ´Ù.
»ç¿ëÀÚ°¡ À¥À» ÅëÇØ KMP ½Ã½ºÅÛ¿¡ Á¢±ÙÇϸé RDB·ÎºÎÅÍ ÇÊ¿äÇÑ °´Ã¼µéÀ» ²¨³»¼ ¼¼¼Ç(session) Ãþ¿¡ µÎ°í »ç¿ëÀÚ°¡ ·Î±×¾Æ¿ô ȤÀº ¼¼¼Ç ŸÀӾƿôµÉ ¶§±îÁö °´Ã¼µéÀ» Á¶ÀÛÇÒ ¼ö ÀÖ´Ù. ÁÖµÈ Á¶ÀÛµéÀº Áú¹®°ú °°Àº ¿äû, ¿äû¿¡ ´ëÇÑ ´ë´ä, ¿äû°ú ´ë´ä¿¡ Âü¿©ÇÑ »ç¿ëÀÚ »çÀÌÀÇ Æò°¡, ±×¸®°í °´Ã¼ »çÀÌÀÇ À̵¿ ¹× °Ë»ö µîÀÌ´Ù. KMP ½Ã½ºÅÛÀ» °³¹ßÇÏ¸é¼ ¸ñÇ¥°¡ ¿©·¯ °¡Áö ÀÖÁö¸¸, ƯÈ÷ ´ÙÀ½°ú °°Àº »çÇ×À» ÃæÁ·½Ã۱â À§ÇØ ³ë·ÂÇß´Ù.
¡ß ¼Õ½±°Ô Àç»ç¿ëÇÒ ¼ö ÀÖÀ» °Í
¡ß »õ·Î¿î ±â´ÉÀ» »¡¸® Ãß°¡ÇÒ ¼ö ÀÖÀ» °Í
¡ß À¯Áöº¸¼ö°¡ ½¬¿ï °Í
¡ß ÀӽùæÆíº¸´Ù´Â ±Ùº»ÀûÀÎ ¹®Á¦¸¦ ÇØ°áÇÒ °Í
¡ß ¿ÜºÎ¿¡¼ °³¹ßµÈ ¼Ò½ºÄÚµå´Â ¿øÄ¢ÀûÀ¸·Î ¼öÁ¤ÇÏÁö ¾ÊÀ» °Í
±× °á°ú KMP À¥ ÇÁ·Î±×·¡¹ÖÀ» À§ÇÑ ÇÁ·¹ÀÓ¿öÅ©¸¦ ÀÛ¼ºÇÏ°Ô µÇ¾ú°í, À¥ ÇÁ·¹ÀÓ¿öÅ©¸¦ ÅëÇØ ºñ±³Àû Àϰü¼º ÀÖ´Â À¥ ÇÁ·Î±×·¡¹Ö ÇÒ ¼ö ÀÖ°Ô µÇ¾ú´Ù. ¶Ç RDB¸¦ ÀÌ¿ëÇÑ ORDB È®ÀåÀ» ÅëÇØ KMP ½Ã½ºÅÛ ÇÁ·Î±×·¡¸Ó°¡ KMP ½Ã½ºÅÛ ³»ÀÇ °´Ã¼¿¡¸¸ ÁýÁßÇÒ ¼ö ÀÖµµ·Ï ÇÏ¿´´Ù.
À¥ ÇÁ·¹ÀÓ¿öÅ©
À¥ ÇÁ·¹ÀÓ¿öÅ©¸¦ °®°í ÀÖ´Ù ÇÏ´õ¶óµµ ½±°Ô À¥ ÇÁ·Î±×·¡¹ÖÇϱâ´Â ¾î·Á¿îµ¥, ±× ÀÌÀ¯´Â À¥ ¾ÖÇø®ÄÉÀÌ¼Ç ÀÚüÀÇ ·ÎÁ÷°ú HTML ºê¶ó¿ìÀú¸¦ ÅëÇØ º¸¿©ÁÙ ÇÁ¸®Á¨Å×À̼ÇÀÌ ½±°Ô ºÐ¸®µÇÁö ¾Ê´Â µ¥ ±âÀÎÇÑ´Ù. ÀÌ·¯ÇÑ ÀÌÀ¯´Â CSS(Cascade Style Sheet), HTML µîÀÇ Ç¥ÁØÀ» Á¤È®È÷ µû¸£´Â ºê¶ó¿ìÀú°¡ ¾ø±â ¶§¹®À̶ó°í »ý°¢ÇÑ´Ù. ´ÜÆíÀûÀÎ ¿¹·Î ºê¶ó¿ìÀúµéÀÌ CSS Ç¥ÁØÀ» Àß ÁöŲ´Ù¸é ÇÁ¸®Á¨Å×À̼ǿ¡ ÇÊ¿äÇÑ ¼¼¼¼ÇÑ Á¤º¸µéÀ» CSS·Î ºÐ¸®ÇÒ ¼ö ÀÖÀ» ¹ýµµ Çѵ¥, ½ÇÁ¦·Î´Â ±×·¯ÇÑ ºê¶ó¿ìÀú°¡ Á¸ÀçÇÏÁö ¾Ê´Â´Ù.
°á±¹ ¼ö¸¹Àº À¥ »çÀÌÆ®µéÀÌ Å×ÀÌºí¿¡¸¸ ÀÇÁöÇØ HTML ¿ä¼ÒµéÀ» ¹èÄ¡ÇÏ´Â µ¥´Â ±×·²¸¸ÇÑ ÀÌÀ¯°¡ ÀÖ¾ú´Ù. ÇÊÀÚÀÇ ÆÀ¿¡¼´Â ¸ðÁú¶ó, ÀÎÅÍ³Ý ÀͽºÇ÷η¯, »çÆÄ¸® µîÀÇ À¥ ºê¶ó¿ìÀú¿¡¼ ½ÇÇèÇØ º» ÈÄ ·ÎÁ÷°ú ÇÁ¸®Á¨Å×À̼ÇÀÇ ¿Ïº®ÇÑ ºÐ¸®´Â Æ÷±âÇÏ°Ô µÇ¾ú´Ù. KMP ½Ã½ºÅÛ¿¡¼ »ç¿ëÇÒ ¸ñÀûÀ¸·Î °³¹ßÇÑ À¥ ÇÁ·¹ÀÓ¿öÅ©´Â ´ÙÀ½°ú °°Àº °ÍµéÀ» Á¦°øÇØ ÁÖ¸ç, ÁÖ·Î CLÀÇ ¸ÅÅ©·Î, CLOS µîÀ» ÀÌ¿ëÇØ °³¹ßÇÏ°Ô µÉ °ÍÀÌ´Ù.
¡ß À¥ »çÀÌÆ® °´Ã¼ÀÇ Á¤ÀÇ. Áï À¥ »çÀÌÆ® Àüü¿¡ ´ëÇØ Àϰü¼º ÀÖ°Ô À¯ÁöµÉ ³»¿ëµéÀ» Á¤ÀÇÇÑ´Ù. ÀÌ¿¡ ¼ÓÇÏ´Â °ÍÀ¸·Î´Â ½ÃÀÛ URL(URL prefix), HTML ÇÁ·Ñ·Î±×(prologue), ¹®ÀÚ¼Â(character set), °¢Á¾ µð·ºÅ丮 ¹× ÆÄÀÏ Á¤º¸(CSS, À̹ÌÁö, ÀÚ¹Ù½ºÅ©¸³Æ® µî), ¸Þ´º Á¤º¸, Çì´õ¸¦ ¸¸µé¾î ÁÖ´Â ÇÔ¼ö, Á¿ìÃø¿¡ »çÀÌÆ®¿¡ °ü·ÃµÈ HTMLÀ» ¸¸µå´Â ¹æ¹ý µî
¡ß À¥ ÆäÀÌÁö °´Ã¼ÀÇ Á¤ÀÇ. ÆäÀÌÁö¸¶´Ù Á¦¸ñ, ¾ÖÇø®ÄÉÀ̼ÇÀÇ ·ÎÁ÷À» °®°í ÀÖ´Â ¾×¼Ç ÇÔ¼ö(action function), ÆäÀÌÁöÀÇ HTMLÀ» ¸¸µé¾î ÁÖ´Â ÇÔ¼ö, Á¿ìÃø¿¡ ÆäÀÌÁö¿¡ °ü·ÃµÈ HTMLÀ» ¸¸µå´Â ¹æ¹ý, ÇöÀç ÆäÀÌÁö·ÎºÎÅÍ ´ÙÀ½ ÆäÀÌÁö·Î À̵¿ÇÏ´Â ±ÔÄ¢ µî
¡ß ºê¶ó¿ìÀúÀÇ ¿äûÀ¸·ÎºÎÅÍ À¥ »çÀÌÆ®¿Í À¥ ÆäÀÌÁö¸¦ ¾ò¾î³»¾î ¾×¼Ç ÇÔ¼ö¸¦ ¼öÇàÇÑ ÈÄ ±× °á°ú¿¡ µû¶ó HTMLÀ» ¸¸µé¾î³»´Â ºä(view) ÇÔ¼öµéÀ» Â÷·Ê·Î È£ÃâÇÏ´Â Áß¾Ó ÇÁ·Î¼¼¼
ORDB È®Àå
ÇÑÆí, CL¿¡¼ RDB¸¦ ORDB·Î »ç¿ëÇϱâ À§Çؼ´Â CLOSÀÇ MOPÀ» ÀÌ¿ëÇØ¾ß Çϱ⠶§¹®¿¡ À¥ ÇÁ·¹ÀÓ¿öÅ©º¸´Ù ¾à°£ ´õ CL¿¡ ´ëÇØ ¾Ë¾Æ¾ß ÇÑ´Ù. MOPÀº CLOS ±¸Çö ÀÚü¿¡ ´ëÇÑ ÇÁ·Î±×·¡¹ÖÀ» °¡´ÉÄÉ Çϴµ¥, MOPÀ» ÀÌ¿ëÇϸé CLOS ±¸¼º¿ä¼ÒµéÀÌ µðÆúÆ®·Î °®°í ÀÖ´Â Àǹ̸¦ ¹Ù²Ù°Å³ª Á¸ÀçÇÏÁö ¾Ê´Â ±¸¼º¿ä¼ÒµéÀ» »õ·Î Á¤ÀÇÇØ CLOS ÀÚü¸¦ È®ÀåÇÒ ¼ö ÀÖ´Ù. MOP¿¡ ´ëÇØ¼´Â AMOPÀÌ À¯ÀÏÇÑ Âü°í¼ÀÌ´Ù. MOPÀ» °øºÎÇÏ·Á¸é ¸ÕÀú CLOS¿¡ ´ëÇÑ ÀÌÇØ°¡ ÇÊ¿äÇϹǷΠSonya E. KeeneÀÇ Ã¥À» °øºÎÇÑ ÈÄ AMOPÀ» °øºÎÇϰųª Âü°í¼·Î »ï´Â °ÍÀÌ ÁÁ´Ù.
KMP ½Ã½ºÅÛÀº RDB¸¦ »ç¿ëÇϱâ À§Çؼ CLSQLÀ» »ç¿ëÇÑ´Ù. CLSQLÀ» °£´ÜÈ÷ ¼Ò°³ÇÏÀÚ¸é CL¿¡¼ RDB¸¦ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÇØÁÖ´Â µå¶óÀ̹ö, CL¿ë ÀÎÅÍÆäÀ̽º ÇÔ¼öµé, CL¿ë ÀÎÅÍÆäÀ̽º µîÀÇ ÁýÇÕÀÌ´Ù. CLSQLÀº ´Ù¾çÇÑ RDB¸¦ µ¿ÀÏÇÑ ÀÎÅÍÆäÀ̽º·Î Áö¿øÇϱâ À§Çؼ °¢ RDB¸¸ÀÇ ºñȣȯ ±â´ÉÀº »ç¿ëÇÏÁö ¾Ê´Â´Ù. KMP ½Ã½ºÅÛÀÇ °æ¿ì RDB·Î PostgreSql¸¸À» »ç¿ëÇϱâ·Î °áÁ¤Ç߱⠶§¹®¿¡ ÀÌ·± Á¦¾àÀº ¿ÀÈ÷·Á ¹æÇذ¡ µÈ´Ù. ƯÈ÷ CLSQL¿¡¼ Á¦°øÇÏ´Â API¸¸À¸·Î´Â PostgreSqlÀÇ »ó¼Ó, many-to-manyÀÇ Ç¥Çö µî¿¡ ´ëÇØ¼ RDBÀÇ Å×ÀÌºí »çÀÌÀÇ °ü°è¿Í °´Ã¼ »çÀÌÀÇ °ü°è°¡ °áÄÚ ÀûÀýÇÏ°Ô À¯ÁöµÉ ¼ö ¾ø¾ú´Ù.
ORDB È®Àå ÀÌÈÄ ÇÁ·Î±×·¡¸Ó´Â º¸ÅëÀÇ CLOS ÇÁ·Î±×·¡¹Ö°ú ¸¶Âù°¡Áö·Î °´Ã¼µéÀ» ¸¸µé°í, °¢ °´Ã¼¿¡ ´ëÇØ ¡®update-record-from-instance¡¯¸¦ ÀÌ¿ëÇØ RDB¿¡ °´Ã¼¸¦ ÀúÀåÇÒ ¼ö ÀÖÀ¸¸ç, ¡®select¡¯¸¦ ÀÌ¿ëÇØ RDB·ÎºÎÅÍ °´Ã¼¸¦ ºÒ·¯³¾ ¼ö ÀÖ´Ù.
(defvar *toplevel-category*) ; »óÀ§ ·¹º§ ºÐ·ù °´Ã¼¸¦ °®°Ô µÉ º¯¼ö
(setq *toplevel-category* (make-category "All" nil nil nil)) ; CLOS Ãþ¿¡¼ ºÐ·ù °´Ã¼ »ý¼º
(update-record-from-instance *toplevel-category*) ; °´Ã¼¸¦ RDB¿¡ ÀúÀå
...
;; RDB·ÎºÎÅÍ °´Ã¼¸¦ ºÒ·¯¿Í¼ ´Ù½Ã º¯¼ö¿Í ¿¬°áÇÑ´Ù.
(setq *toplevel-category*
(first (select 'category
:where [= [slot-value 'category 'name] "All"] :flatp t :refresh t)))
KMP ½Ã½ºÅÛÀÇ ¸ðµç °´Ã¼µéÀº ¿µ¼Ó¼º °´Ã¼ÀÇ id(Persistent Object ID : POID)¸¦ °®°Ô µÉ °ÍÀ̹ǷΠ¾ÕÀÇ Äڵ忡¼ ¸¶Áö¸· ÁÙÀº ´ÙÀ½°ú °°ÀÌ ¹Ù²ð ¼ö ÀÖÀ» °ÍÀÌ´Ù.
(setq *toplevel-category* (find-persistent-object (poid *toplevel-category*) :refresh t))
ORDB È®ÀåÀº MOPÀ» ÀÌ¿ëÇØ ±âÁ¸ÀÇ CLSQL¿¡ ´ëÇÑ ¼öÁ¤À» ÃÖ¼Ò·Î ÇÏ¸é¼ ¿øÇÏ´Â È®ÀåÀ» ½ÃµµÇÒ °èȹÀÌ´Ù.
SW °³¹ßÀÇ Çʼö °úÁ¤, Çü»ó °ü¸®
Çü»ó °ü¸®´Â CL ÇÁ·Î±×·¡¹Ö°ú´Â Á÷Á¢ÀûÀÎ °ü·ÃÀº ¾øÁö¸¸, ¼ÒÇÁÆ®¿þ¾î¸¦ °³¹ßÇÏ´Â µ¥ ÀÖ¾î¼ ²À ÇÊ¿äÇÑ ºÎºÐÀ̱â±â ¶§¹®¿¡ Àá±ñ ¾ð±ÞÇϱâ·Î ÇÑ´Ù.
KMP ½Ã½ºÅÛÀ» °³¹ßÇÏ´Â µ¥ ÀÖ¾î¼ »ç¿ëÇÏ´Â Çü»ó °ü¸® ÅøÀº CVS(Control Version System)ÀÌ´Ù. CVS´Â ±âº»ÀûÀ¸·Î ¼Ò½ºÄÚµåÀÇ ¹öÀüÀ» ÄÁÆ®·ÑÇϴµ¥ »ç¿ëµÇ´Â ÅøÀÌ´Ù. ÇÊÀÚÀÇ ÆÀ¿¡¼´Â ´ÙÀ½°ú °°Àº °ÍµéÀ» CVS¸¦ ÅëÇØ °ü¸®ÇÑ´Ù.
[1] Á÷Á¢ °³¹ßÇÑ KMP ½Ã½ºÅÛ ¼Ò½ºÄÚµå
[2] KMP ½Ã½ºÅÛÀ» °³¹ßÇÏ´Â µ¥ »ç¿ëµÈ, Á÷Á¢ °³¹ßÇÏÁö ¾ÊÀº ¶óÀ̺귯¸®µéÀÇ ¿ÀǼҽº ÄÚµå(TBNL, CLSQL µî)
[3] CL °³¹ß Åø ¼Ò½º ȤÀº ¹ÙÀ̳ʸ® ÆÐÄ¡ ÆÄÀÏ
[4] KMP ½Ã½ºÅÛ °³¹ß ȯ°æ¿¡ ´ëÇÑ ¼³Á¤ ÆÄÀÏ ÄÚµå, ºôµå ½ºÅ©¸³Æ®(.bashrc, .emacs, .lispworks, .sbclrc, SLIME µî)
[1]¿¡ ´ëÇÑ °ü¸®´Â ´ëºÎºÐ ÇÏ´Â °ÍÀÌ´Ï º°µµÀÇ ¼³¸íÀÌ ÇÊ¿äÄ¡ ¾ÊÀ» °ÍÀÌ´Ù. [2]ÀÇ °æ¿ì´Â »ç¿ëµÈ ¶óÀ̺귯¸®¿¡ ´ëÇÑ °ü¸®·Î ¸ðµç °³¹ßÀÚµéÀÌ µ¿ÀÏÇÑ ¹öÀüÀ» »ç¿ëÇϸç, ¾÷±×·¹À̵å Á÷Àü [1]ÀÇ ÄÚµå¿Í ¹®Á¦°¡ ¾ø´ÂÁö È®ÀÎÇÑ ÈÄ CVS·Î µî·Ï(import)ÇÑ´Ù. [3]Àº ÁÖµÈ Åø ÀÚü¿¡ ´ëÇÑ °ü¸®·Î ¸ðµç °³¹ßÀÚ°¡ µ¿ÀÏÇÑ °³¹ß ÅøÀ» »ç¿ëÅä·Ï Çϱâ À§ÇÔÀÌ´Ù. [4]´Â ¸ðµç °³¹ßÀÚµéÀÌ µ¿ÀÏÇÑ °³¹ß ȯ°æÀ» À¯ÁöÇÏ´Â µ¥ ÇÊ¿äÇÏ´Ù.
¹°·Ð ÀÌ ±ÛÀ» ÀÐ°í ³»¿ëÀ» ¼öÇàÇØ º¸±â À§Çؼ ¾Õ°ú À¯»çÇÑ Çü»ó °ü¸®¸¦ ÇÒ ÇÊ¿ä´Â ¾ø´Ù. ´Ù¸¸ ¾çÁúÀÇ ¼ÒÇÁÆ®¿þ¾î¸¦ °³¹ßÇϱâ À§Çؼ´Â ±×·± °ü¸®°¡ ÇÊ¿äÇÏ´Ù´Â Á¡, ±×¸®°í ÀÌ ±ÛÀÇ ³»¿ëµéÀÌ ÇÏ·ç¾ÆÄ§¿¡ ¸¸µé¾îÁø °ÍÀÌ ¾Æ´Ï¶ó ²ÙÁØÇÑ ³ë·ÂÀ» ÅëÇÑ ÀÛÀº º¯ÈµéÀÇ ÃÑÇÕÀ̶ó´Â Á¡À» ¹àÈ÷°í ½Í´Ù.
CL ÇÁ·Î±×·¡¹Ö ±âÃÊ
°æÇè ÀÖ´Â ÇÁ·Î±×·¡¸Ó¶ó°í ÇÒÁö¶óµµ óÀ½ CL °³¹ß ȯ°æ°ú ÇÁ·Î±×·¡¹ÖÀ» Á¢ÇÏ´Â °³¹ßÀÚ´Â ¾î·Á¿òÀ» ´À³¥ ¼ö Àֱ⠶§¹®¿¡ SLIME À§ÁÖ·Î °³¹ß ȯ°æÀ» »ç¿ëÇÏ´Â ¹æ¹ý°ú CLÀÇ ±âº»ÀûÀÎ °³³ä - ƯÈ÷ CLHS¸¦ Àд ¹æ¹ý - À» °£´ÜÈ÷ ¼Ò°³Çϱâ·Î ÇÑ´Ù.
SLIMEÀÇ »ç¿ë
Emacs¸¦ ½ÇÇàÇÑ ÈÄ Emacs¿¡¼ ¸ÞŸ Ű(º¸ÅëÀÇ °æ¿ì
Ű)¿Í x¸¦ °°ÀÌ ´·¯¼ Ä¿¸Çµå ¶óÀÎÀ¸·Î À̵¿ÇØ ¡°slime¡±À» ÀÔ·ÂÇϰí(M-x slime) ¿£Å͸¦ ´©¸£°í ±â´Ù¸®¸é SLIMEÀÌ ½ÇÇàµÇ°í ¸®½º³Ê ¹öÆÛ(*slime-repl[1]*)¸¦ º¼ ¼ö ÀÖ´Ù.
; SLIME 2004-06-08
CL-USER>
¸®½º³Ê¿¡¼ ¼ýÀÚ¸¦ ÀÔ·ÂÇÏ°í ¿£Å͸¦ Ä¡¸é CL ½Ã½ºÅÛÀÌ °á°ú¸¦ Àаí(read), Æò°¡ÇÑ ÈÄ(eval), °á°ú¸¦ Ãâ·Â(print)ÇÏ´Â °úÁ¤À» º¼ ¼ö Àִµ¥, ÀÌ °úÁ¤À» read-eval-print loopÀ̶ó°í ºÎ¸¥´Ù.
CL-USER> (+ 1 2 3)
6
CL-USER>
Å×½ºÆ®¿ë ¼Ò½º ÆÄÀÏÀ» ¸¸µé¾î º¸ÀÚ. À» ´©¸¥ ä·Î x¿Í f¸¦ ¼ø¼´ë·Î ´©¸£¸é(Ctrl-x-f) Ä¿¸Çµå ¶óÀÎÀÌ ¡°Find file: ~/¡±·Î ¹Ù²î¸é¼ ÆÄÀÏ À̸§À» ÀÔ·ÂÇÒ °ÍÀ» ¿ä±¸ÇÒ °ÍÀÌ´Ù. ¡®test.lisp¡¯À» ÀÔ·ÂÇÏ°í ¿£Å͸¦ Ä¡¸é test.lisp ¹öÆÛ°¡ »ý±ä´Ù. CL ÇÁ·Î±×·¡¹Ö½Ã ¼Ò½ºÄÚµå´Â °ü·Ê»ó .cl, .lisp µîÀÇ È®ÀåÀÚ¸¦ ºÙÀδÙ. test.lisp ¹öÆÛ¿¡¼ ´ÙÀ½°ú °°Àº ÇÔ¼ö Á¤ÀǸ¦ ½ÃÀÛÀ¸·Î ÆÄÀÏÀ» ÆíÁýÇÏÀÚ.
(defun hello-world ()
¸¶Áö¸· °ýÈ£¸¦ ÀÔ·ÂÇÑ ÈÄ ¸¦ ´©¸£¸é Ä¿¼°¡ ´ÙÀ½ ÁÙ·Î À̵¿ÇÏ¸é¼ ÀÚµ¿À¸·Î µé¿©¾²±â°¡ µÈ´Ù. ±×³É ¿£Å͸¦ ´©¸¥ °æ¿ì¿¡´Â ÅÇ Å°¸¦ ´©¸§À¸·Î½á µé¿©¾²±â¸¦ ÇÒ ¼ö ÀÖ´Ù. ÅÇ Å°¸¦ ¿©·¯ ¹ø Ä¡´õ¶óµµ µé¿©¾²±â´Â º¯È°¡ ¾øÀ½¿¡ À¯ÀÇÇÏÀÚ. Emacs´Â ¸®½ÀÀÇ ¹®¹ýÀ» ¾Ë±â ¶§¹®¿¡ ²À ÇÊ¿äÇÑ ¸¸ÅÀÇ µé¿©¾²±â À̿ܿ¡´Â Çã¿ëÇÏÁö ¾ÊÀ¸·Á°í ÇÒ °ÍÀÌ´Ù. ´ÙÀ½ ÁÙ¿¡´Â ÇÔ¼öÀÇ ¸®ÅÏ °ªÀ» ¾²°í °ýÈ£¸¦ ´Ý´Â´Ù.
"Hello, welcome to world of Lisp!")
°ýÈ£¸¦ ´ÝÀ¸¸é Emacs´Â ´Ý´Â °ýÈ£°¡ ¾î¶² ¿©´Â °ýÈ£¿Í ¦À» ÀÌ·ç´ÂÁö º¸¿©ÁØ´Ù. ÈçÈ÷ óÀ½ Lisp¸¦ Á¢ÇÏ´Â »ç¶÷ÀÌ °Þ´Â ¾î·Á¿òÀÌ ¸¹Àº °ýÈ£ÀÇ ÃâÇö(?)ÀÌ´Ù. Àͼ÷ÇÑ ¸®½À ÇÁ·Î±×·¡¸Ó´Â °ýÈ£¿¡ ½Å°æÀ» °ÅÀÇ ¾²Áö ¾Ê°í, EmacsÀÇ µµ¿òÀ» ¹Þ¾Æ °ýÈ£ÀÇ Â¦ÀÌ ¾î¶² °ÍÀΰ¡ È®ÀÎÇÑ´Ù. ¶Ç ¸®½À Äڵ带 ÀÐÀ» ¶§´Â °ýÈ£º¸´Ù´Â µé¿©¾²±â¿¡ ÁÖÀǸ¦ ±â¿ïÀ̸ç ÀÌÇØÇØ¾ß ÇÑ´Ù. ¿¹¸¦ µé¾î ¾ÕÀÇ ÇÔ¼ö Á¤ÀÇ ¹Ø¿¡ ´ÙÀ½°ú °°Àº Ʋ¸° ÇÔ¼ö Á¤ÀǸ¦ ÀÔ·ÂÇØ º¸ÀÚ.
(defun hello-world (
"Hello, welcome to world of Lisp!"
ÀÌÁ¦ µÎ ¹øÂ° ÁÙÀÇ ¾Æ¹« À§Ä¡¿¡¼³ª ÅÇ Å°¸¦ Ãĺ¸¸é µé¿©¾²±â°¡ ÀÌ»óÇÏ°Ô µÇ´Â °ÍÀ» º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù. Àͼ÷ÇÑ ¸®½À ÇÁ·Î±×·¡¸Ó´Â ¹Ù·Î ¾Õ¿¡¼ ¹«¾ùÀΰ¡ À߸øµÇ¾úÀ½À» ÆÄ¾ÇÇÏ°í ¼öÁ¤ÇÒ °ÍÀÌ´Ù.
´Ù½Ã ù ¹øÂ° ÇÔ¼ö Á¤ÀǸ¦ »ìÆìº¸ÀÚ. ¸¸ÀÏ ¸î °³ÀÇ °ýÈ£¸¦ Á¦°ÅÇÑ´Ù¸é Äڵ尡 ¾î¶»°Ô º¸Àϱî?
defun hello-world ()
"Hello, welcome to world of Lisp!"
Àͼ÷ÇÑ Lisp ÇÁ·Î±×·¡¸Ó´Â °ýÈ£ÀÇ ¼ö¿¡ »ó°ü¾øÀÌ ¸Ó¸´¼Ó¿¡¼ À§¿Í °°Àº ÇüÅ·Π±â¾ïÇϱ⵵ ÇÑ´Ù. ÀÌ ÄÚµåÀÇ Àǹ̴ ¡°hello-world¶ó´Â ÇÔ¼ö´Â Á¤ÀÇÇϴµ¥, ÀÎÀÚ´Â ¾ø°í ÇÏ´Â ÀÏÀº (ȯ¿µÇÑ´Ù´Â) ¹®ÀÚ¿À» ¸®ÅÏÇÑ´Ù¡±´Â °ÍÀÌ´Ù. ¿¹¿¡¼¿Í °°ÀÌ Lisp¿¡¼´Â ÇÔ¼ö Á¤Àǽà Àǹ̻óÀ¸·Î °¡Àå ¸¶Áö¸·¿¡ À§Ä¡ÇÏ´Â °ÍÀÌ ¸®ÅϵȴÙ. CL¿¡¼ ÇÔ¼ö´Â Ç×»ó ¸®ÅÏ °ªÀ» °®´Â´Ù.
Á¦´ë·Î Á¤ÀÇµÈ hello-world¸¦ º¹»çÇØ ¸®½º³Ê¿¡¼ Æò°¡ÇÏÀÚ. ÇÔ¼ö Á¤ÀÇÀÇ Ã¹ ºÎºÐÀÎ °ýÈ£¿¡ Ä¿¼¸¦ À§Ä¡½ÃŲ ÈÄ ¸¦ ´©¸£¸é Àüü Á¤Àǰ¡ ¼±ÅõȴÙ. ¸¦ ´·¯¼ º¸ÀÌÁö ¾Ê´Â Àӽà ¹öÆÛ¿¡ ÀúÀåÇϰí, ¸¦ ´·¯¼ ¡°*sl¡±À» ÀÔ·ÂÇϰí ÅÇÀ» ´©¸£¸é °¡´ÉÇÑ ¹öÆÛµéÀ» º¸¿©ÁØ´Ù. ¡°*slime-repl[1]*¡±À» ¿Ï¼ºÇϱâ À§ÇØ Çѹ®ÀÚ¾¿ ÀÔ·ÂÇÏ¸é¼ ÅÇÀ» ´·¯º¸¸é ¾î´À ¼ø°£¿¡ ÀÚµ¿À¸·Î È®ÀåµÉ °ÍÀÌ´Ù. ¿£Å͸¦ ´·¯¼ ¸®½º³Ê ¹öÆÛ·Î À̵¿ÇÑ´Ù. ¸®½º³Ê ¹öÆÛ¿¡¼ ¸¦ ´©¸£¸é ÇÔ¼ö Á¤Àǰ¡ ºÙ¿©Áø´Ù. ÀÌÁ¦ ¿£Å͸¦ ´©¸£¸é ¸®½º³ÊÀÇ read-eval-print loop °úÁ¤À» °ÅÃļ ´ÙÀ½°ú °°ÀÌ µÉ °ÍÀÌ´Ù.
CL-USER> (defun hello-world ()
"Hello, welcome to world of Lisp!")
HELLO-WORLD
CL-USER>
¸®½º³Ê´Â HELLO-WORLD¸¦ ¸®ÅÏÇß´Ù. defun¿¡ Ä¿¼¸¦ ¿Å±ä ÈÄ ¡°C-c C-h¡±¸¦ ´·¯º¸ÀÚ. Emacs°¡ Á¦´ë·Î ¼³Á¤µÆ´Ù¸é À¥ ºê¶ó¿ìÀú°¡ ½ÇÇàµÇ°í CLHSÀÇ defun ÆäÀÌÁö¸¦ º¸¿©ÁÙ °ÍÀÌ´Ù. CLHSÀÇ defun ÆäÀÌÁö¸¦ º¸¸é ¡°Syntax¡± Ç׸ñ ¸¶Áö¸·¿¡ ¡°=> function-name¡± À̶ó°í µÇ¾î Àִµ¥, ±× Àǹ̴ ÇÔ¼ö Á¤ÀÇ Æò°¡ °á°ú·Î ÇÔ¼ö À̸§ÀÌ ¸®Åϵȴٴ °ÍÀÌ´Ù.
¸®½º³Ê¿¡¼ ÇÔ¼ö¸¦ ½ÇÇà½ÃÄÑ º¸ÀÚ. CLÀÇ ÇÔ¼ö È£ÃâÀº °ýÈ£·Î ½ÃÀÛÇØ¼ ù ¹øÂ°°¡ ¿¬»êÀÚÀÌ°í ³ª¸ÓÁö°¡ ÀÎÀÚÀÌ´Ù. hello-worldÀÇ °æ¿ì¿¡´Â ÀÎÀÚ°¡ ¾øÀ¸¹Ç·Î ´ÙÀ½°ú °°ÀÌ ÀÔ·ÂÇÏ°í ¿£ÅÍ Å°¸¦ ´©¸£¸é ±× °á°ú°¡ ¸®ÅϵȴÙ.
CL-USER> (hello-world)
"Hello, welcome to world of Lisp!"
CL-USER>
´Ù½Ã test.lisp ¹öÆÛ·Î À̵¿Çؼ(Ctrl-x b) µÎ ¹øÂ° ÇÔ¼ö¸¦ Á¤ÀÇÇØ º¸ÀÚ.
(defun happy-hacking ()
"Happy Lisp hacking!")
À̹ø¿¡´Â ¸®½º³Ê·Î À̵¿ÇÏÁö ¸»°í ÆÄÀÏ ¹öÆÛ¿¡¼ ¹Ù·Î ÇÔ¼ö¸¦ Æò°¡ÇÏ°í ½ÇÇà½ÃÄÑ º¸ÀÚ. Ä¿¼¸¦ ÇÔ¼ö Á¤ÀÇ ½ÃÀÛ°ú ³¡ »çÀÌ¿¡ ¾Æ¹« °÷¿¡ À§Ä¡½ÃŲ ÈÄ Ctrl-M-x¸¦ ´©¸£¸é Ä¿¸Çµå ¶óÀο¡ ¡°HAPPY-HACKING¡±À̶ó°í ÇÔ¼ö Á¤Àǰ¡ ¼º°øÀûÀ¸·Î Æò°¡µÆÀ½À» ¾Ë·ÁÁÖ´Â ¸Þ½ÃÁö¸¦ º¼ ¼ö ÀÖ´Ù. ÆÄÀÏ¿¡ ´ÙÀ½°ú °°ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ÆûÀ» Ãß°¡ÇÑ ÈÄ ÆûÀÇ ¸¶Áö¸·À¸·Î À̵¿ÇØ(Ctrl-e) ±× ÆûÀ» Æò°¡Çϰí(Ctrl-x-e), Ä¿¸Çµå ¶óÀο¡ ¸®ÅÏ °ªÀÌ Ãâ·ÂµÊÀ» È®ÀÎÇϱ⠹ٶõ´Ù.
(happy-hacking)
óÀ½ CLÀ» Á¢ÇÏ´Â ´ëºÎºÐÀÇ »ç¶÷µéÀÌ ¿øÇÏ´Â °ÍÀº ¸®ÅÏ °ª¿¡ ¸¸Á·ÇÏÁö ¸øÇÏ°í »çÀ̵å ÀÌÆåÆ®(side effect)·Î ¹«¾ùÀΰ¡¸¦ ȸ鿡 Ãâ·Â(ÇÁ¸°Æ®)ÇÏ´Â °ÍÀÌ´Ù. ÀÌÁ¦ CLÀÇ ¸·°ÇÑ format ÇÔ¼ö¸¦ ÀÌ¿ëÇØ °£´ÜÇÑ Ãâ·ÂÀ» ¿¬½ÀÇØ º¸ÀÚ. test.lisp¿¡ ´ÙÀ½°ú °°Àº ÇÔ¼ö Á¤ÀǸ¦ Ãß°¡ÇÑ´Ù.
(defun hello-and-happy-hacking (name)
(format t "~&~A, ~A~&~A~&" name (hello-world) (happy-hacking)))
¾ÕÀÇ ÇÔ¼ö Á¤ÀÇ´Â nameÀ̶ó´Â ÀÎÀÚ¸¦ Çϳª °®´Â´Ù. ´ÙÀ½À» Ctrl-x-e¸¦ ÀÌ¿ëÇØ Æò°¡ÇØ º¸¸é ´Þ¶û NIL¸¸ÀÌ ¸®ÅϵǴ °ÍÀ» º¼ ¼ö ÀÖ´Ù. À̰ÍÀº À߸øµÈ °ÍÀÌ ¾Æ´Ï¶ó Á¦´ë·Î µÈ °ÍÀε¥, hello-and-happy-hackingÀº Ç¥ÁØ Ãâ·Â(*standard-output*)À¸·Î Ãâ·ÂÇÏ´Â »çÀ̵å ÀÌÆåÆ® ÇÔ¼öÀ̱⠶§¹®¿¡ Æò°¡ °á°ú Áß »çÀ̵å ÀÌÆåÆ®·Î Ç¥ÁØ Ãâ·Â¿¡ Ãâ·ÂÇÏ°í °á°ú - ÀÌ °æ¿ì NIL - ¸¦ ¸®ÅÏÇϱ⠶§¹®ÀÌ´Ù.
(hello-and-happy-hacking 'lisper)
(hello-and-happy-hacking "lisper")
¾ÕÀÇ ³»¿ëÀ» º¹»çÇØ¼ ¸®½º³Ê¿¡¼ Á÷Á¢ ÀÔ·ÂÇϸé À̹ø¿¡´Â ³»¿ëÀÌ ¸®½º³Ê ¹öÆÛÀÇ Ç¥ÁØ Ãâ·ÂÀ¸·Î Ãâ·ÂµÈ ÈÄ °¢°¢ NILÀÌ ¸®ÅϵÊÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.
CL-USER> (hello-and-happy-hacking "lisper")
lisper, Hello, welcome to world of Lisp!
Happy Lisp hacking!
NIL
CL-USER> (hello-and-happy-hacking 'lisper)
LISPER, Hello, welcome to world of Lisp!
Happy Lisp hacking!
NIL
CL-USER>
¸®½º³Ê¿¡¼ ´ÙÀ½°ú °°ÀÌ ÀÔ·ÂÇØ º¸ÀÚ.
(hello-and-happy-hacking lisper)
¿£Å͸¦ Ä¡ÀÚ¸¶ÀÚ µð¹ö°Å·Î À̵¿ÇÒ °ÍÀÌ´Ù. SBCLÀÇ °æ¿ì ´ÙÀ½°ú °°Àº °á°ú¸¦ ¾ò¾ú´Ù.
The variable LISPER is unbound.
[Condition of type UNBOUND-VARIABLE]
Restarts:
0: [NIL] Try evaluating LISPER again.
1: [USE-VALUE] Specify a value to use this time instead of evaluating LISPER.
2: [SET] Specify a value to set LISPER to.
3: [ABORT] Abort handling SLIME request.
4: [ABORT] Quit process.
Backtrace:
0: CONDITIONS::CONDITIONS-ERROR (:INVISIBLEP T UNBOUND-VARIABLE (:NAME LISPER))
1: CONDITIONS::UNBOUND-SYMBOL-ERROR-INTERNAL (:INVISIBLEP T LISPER)
...
µð¹ö°Å´Â ù° ÁÙ¿¡¼ º¯¼ö LISPER°¡ unbound¶ó°í ºÒÆòÇϰí ÀÖ´Ù. ÀÌÀ¯ ÀÖ´Â ºÒÆòÀÌ´Ù. µû¿ÈÇ¥(¡®)¸¦ ºÙÀ̸é ÀÔ·ÂÇÑ ±×´ë·Î ½Éº¼·Î ÀÎÁ¤µÇÁö¸¸, µû¿ÈÇ¥°¡ ¾ø´Ù¸é º¯¼ö·Î Ãë±ÞÇϱ⠶§¹®ÀÌ´Ù. µÎ ¹øÂ° ÁÙ¿¡¼´Â ¿¹¿Ü »óȲ¿¡ ´ëÇÑ ¼³¸íÀ¸·Î unbound-variableÀ̶ó´Â ¿¹¿Ü»óȲÀÌ ¹ß»ýÇßÀ½À» º¸¿©ÁØ´Ù. Restarts¿¡´Â ÀÌ »óȲ¿¡¼ °¡´ÉÇÑ ¼±ÅÃÀÌ ³ªÅ¸³ª´Âµ¥, 0À» ´©¸£¸é º¯¼ö¸¦ ´Ù½Ã Æò°¡Ç϶ó´Â °ÍÀ̰í, 1À» ´©¸£¸é À̹ø¿¡¸¸ ´Ù¸¥ °ªÀ» »ç¿ëÇ϶ó´Â °ÍÀ̸ç, 2¸¦ ´©¸£¸é º¯¼ö¸¦ ƯÁ¤ °ªÀ¸·Î ¼ÂÆÃÇØ »ç¿ëÇ϶ó´Â ÀǹÌÀÌ´Ù. 3°ú 4´Â Æò°¡ ¿äûÀ» Ãë¼ÒÇÏ°Ô µÈ´Ù.
µð¹ö°ÅÀÇ ¸Þ½ÃÁö¸¦ Àß ÀÐÀ¸¸é¼ °¢ ¼±ÅÃÀ» Çѹø¾¿ ½ÃµµÇØ º¸±â ¹Ù¶õ´Ù. Backtrace´Â ¹®Á¦ ¹ß»ý±îÁöÀÇ ½ºÅÃÀ» º¸¿©ÁØ´Ù. µð¹ö°Å¿¡¼ °¡´ÉÇÑ ´Ù¾çÇÑ ¸í·ÉµéÀº À» ÅëÇØ È®ÀÎÇϰí ÀÍÈú ¼ö ÀÖ´Ù.
SLIMEÀÇ ´ÜÃàŰ´Â ¸®½º³Ê ¹öÆÛ³ª ¸®½À ÆÄÀÏ ¹öÆÛ¿¡¼ À» ÅëÇØ º¼ ¼ö ÀÖÀ¸¹Ç·Î, ÇÏ·ç¿¡ ´Ù¼¸ °³ Á¤µµÀÇ ¸í·É¾î¸¦ °ñ¶ó¼ ÀÍÈ÷¸é ÇÑ´Þ Á¤µµ Áö³ª¸é Àß »ç¿ëÇÒ ¼ö ÀÖÀ¸¸®¶ó°í »ý°¢ÇÑ´Ù.
CL ±âÃÊ
CL ÇÁ·Î±×·¡¹ÖÀ» ½ÃÀÛÇϱâ À§ÇØ ÇÊ¿äÇÑ ±âº» °³³ä°ú CLÀÇ ±¸¼º¿ä¼Òµé¿¡ ´ëÇØ¼ ¾Ë¾Æº¸±â·Î ÇÏÀÚ. °£´ÜÇÏ°Ô ³ª¿µÈ ¿¹µéÀº ¸®½º³Ê¿¡¼ ½ÇÇàÇØ ºÁµµ ÁÁÀ» °ÍÀÌ´Ù.
LispÀº ´Ù¸¥ ¿©·¯ °¡Áö ÀڷᱸÁ¶¸¦ °®°í ÀÖÁö¸¸, ¿ª½Ã ¸®½ºÆ®°¡ °¡Àå ±âº»ÀûÀÎ ÀڷᱸÁ¶ÀÌ´Ù. Lisp¿¡¼´Â °ýÈ£·Î ½ÃÀÛÇÏ°í ³¡³ª´Â ±¸¼º¿ä¼Ò¸¦ ÀͽºÇÁ·¹¼Ç(expression, ¼ö½Ä) ȤÀº Æû(form)À̶ó°í ºÎ¸£¸ç, ±× ¿ÜÀÇ ¸ðµç °ÍµéÀ» ¾ÆÅè(atom)À̶ó°í ºÎ¸¥´Ù. ¾ÆÅèÀº ÀÖ´Â ±×´ë·Î Æò°¡µÇ¸ç, ±× ¿¹·Î´Â ¹®ÀÚ¿, ¹è¿, ¼ýÀÚ, CLOS °´Ã¼ µî ´Ù¸¥ ÇÁ·Î±×·¡¹Ö ¾ð¾î¿¡¼µµ ÈçÈ÷ º¼ ¼ö ÀÖ´Â °Íµé »Ó ¾Æ´Ï¶ó ½Éº¼(symbol), ÇÔ¼ö µî ´Ù¼Ò »ý¼ÒÇÑ °ÍµéÀÌ ¸ðµÎ Æ÷ÇԵȴÙ.
¡°¹®ÀÚ¿¡±
#(1 2 3) ; ¹è¿
3.14 ; ¼ýÀÚ
'cl-symbol ; ½Éº¼. ÄõÆ®(µû¿ÈÇ¥)·Î ½ÃÀÛÇÏ´Â ¸î¸î Ư¼ö ¹®ÀÚµéÀ» Á¦¿ÜÇÑ ¹®ÀÚµéÀÇ ¸ðÀÓ
#'+ ; ÇÔ¼ö. ÇÔ¼ö¸¦ ÁöĪÇϱâ À§Çؼ´Â ¡°#'¡± °¡ »ç¿ëµÈ´Ù.
ÆûÀº ÀÌ¹Ì ¾ð±ÞÇÑ ¹Ù¿Í °°ÀÌ °ýÈ£·Î °¨½Ñ ÇüÅÂÀÌ´Ù. µû¿ÈÇ¥·Î ½ÃÀÛÇÏ´Â ÆûÀº º¸ÀÌ´Â ±×´ë·Î µ¥ÀÌÅÍ·Î Ãë±ÞÇϸç, ±×·¸Áö ¾ÊÀº °ÍµéÀº ÄÚµå·Î Ãë±ÞÇÑ´Ù.
'(cons a b) ; ¼¼ °³ÀÇ ¾ÆÅè - cons, a, b ·Î ÀÌ·ç¾îÁø ¸®½ºÆ®
(cons 'a 'b) ; ÇÔ¼ö cons¸¦ °¢°¢ ½Éº¼ÀÎ µÎ °³ÀÇ ÀÎÀڷΠȣÃâÇÏ´Â ÄÚµå. °á°ú´Â (a . b)
µ¥ÀÌÅͰ¡ ¾Æ´Ñ ÄÚµå Æû¿¡¼ ÆûÀÇ Ã¹ ¹øÂ° ¿À´Â °Í¿¡ µû¶ó ´õ ÀÚ¼¼È÷ ÆûÀ» ±¸º°ÇÒ ¼ö ÀÖ´Ù. Áï ÄÚµå ÆûÀÇ Ã¹ ¹øÂ° ¿ä¼Ò´Â ½ºÆä¼È ¿ÀÆÛ·¹ÀÌÅÍ, ¸ÅÅ©·Î, ÇÔ¼ö Áß Çϳª°¡ µÈ´Ù. ½ºÆä¼È ¿ÀÆÛ·¹ÀÌÅÍ È¤Àº ¸ÅÅ©·Î·Î ½ÃÀ۵Ǵ ÆûÀ» ¡°½ºÆä¼È Æû(special form)¡±À̶ó°í ºÎ¸£¸ç º¸Åë ÇÔ¼ö·Î ½ÃÀ۵Ǵ ÆûÀº ±×³É ¡°Æû¡±À̶ó°í ºÎ¸£´Â °ÍÀÌ °ü·ÊÀÌ´Ù.
½ºÆä¼È ¿ÀÆÛ·¹ÀÌÅÍ´Â CLÀÇ ±âÃÊ ±¸¼º¿ä¼Ò·Î »ç¿ëÀÚÀÎ CL ÇÁ·Î±×·¡¸ÓµéÀº ÀÌ·± Á¾·ùÀÇ ±¸¼º¿ä¼Ò¸¦ ¸¸µé ¼ö ¾ø´Ù. ¸ÅÅ©·Î¿Í ÇÔ¼ö´Â ÀÌ·± ±âÃÊ ±¸¼º¿ä¼Ò ¹× ´Ù¸¥ ¸ÅÅ©·Î¿Í ÇÔ¼ö¸¦ ÀÌ¿ëÇØ ¸¸µé¾îÁø °ÍÀ¸·Î, CL ½Ã½ºÅÛ¿¡ ÀÌ¹Ì Á¸ÀçÇÏ´Â °Íµéµµ ¸¹Áö¸¸ CL ÇÁ·Î±×·¡¸Óµéµµ Çʿ信 µû¶ó Á¤ÀÇÇØ CL ½Ã½ºÅÛÀ» È®ÀåÇØ ³ª°¥ ¼ö ÀÖ´Ù. ºñ±³Àû ¸¹ÀÌ »ç¿ëÇÏ°Ô µÉ ½ºÆä¼È ¿ÀÆÛ·¹ÀÌÅͷδ if, let, let*, flet, labels, progn, setq, unwind-protect, quote, return-from µîÀÌ ÀÖÀ¸¸ç, ¸ÅÅ©·Î´Â defun, cond, loop, do, dolist, defclass, defstruct, defmethod µîÀÌ ÀÖ´Ù. ÇÔ¼ö´Â ¾çÀûÀ¸·Î ¸¹±â ¶§¹®¿¡ ¸î °¡Áö ²Å¾Æ¼ ³ª¿ÇÑ´Ù´Â °ÍÀÌ ¹«ÀǹÌÇÏ´Ù.
´ÙÀ½Àº CLÀÇ ¸ÅÅ©·Î¸¦ Á¤ÀÇÇÏ´Â ¿¹ÀÌ´Ù. ÀÌ ¿¹¸¦ ÅëÇØ ½ºÆä¼È ¿ÀÆÛ·¹ÀÌÅÍ, ¸ÅÅ©·Î, ÇÔ¼ö µîÀÌ ¾î¶»°Ô ¾²¿´°í Àǹ̰¡ ¾î¶»°Ô ´Ù¸¥Áö »ìÆìº¸±â·Î ÇÏÀÚ.
(defmacro bind-when ((var test-form) &body form)
`(let ((,var ,test-form))
(when ,var
,@form)))
¾ÕÀÇ ÆûÀº defmacro ÆûÀ¸·Î defmacro´Â ¸ÅÅ©·ÎÀ̰í, bind-whenÀº Á¤ÀÇÇÏ´Â ¸ÅÅ©·Î À̸§, var, test-form, formµîÀº ¸ÅÅ©·Î ÀÎÀÚÀÌ´Ù. ÀÌ ¸ÅÅ©·Î´Â ·±Å¸ÀÓ¿¡ test-formÀ» Æò°¡ÇÑ ÈÄ ±×°ÍÀÌ NILÀÌ ¾Æ´Ñ °æ¿ì¿¡¸¸ form ºÎºÐÀ» ¼öÇàÇÑ´Ù. ¾ÕÀÇ ½ºÆä¼È Æû¿¡¼ letÀº ½ºÆä¼È ¿ÀÆÛ·¹ÀÌÅÍÀ̰í, defmacro, when µîÀº ¸ÅÅ©·ÎÀÌ´Ù(whenÀº if ½ºÆä¼È ¿ÀÆÛ·¹ÀÌÅ͸¦ ÀÌ¿ëÇØ ¸¸µç ¸ÅÅ©·ÎÀÌ´Ù). ¾Õ¿¡¼ Á¤ÀÇÇÑ ¸ÅÅ©·Î´Â ´ÙÀ½°ú °°ÀÌ »ç¿ëµÉ °ÍÀÌ´Ù.
;;; bind-whenÀº ¸ÅÅ©·Î. ¸ÅÅ©·Î¸¦ »ç¿ëÇÏ´Â ½ºÆä¼È Æû
(dolist (maybe-integer-string '("abc" "123" "def" "456"))
(bind-when (integer (parse-integer maybe-integer-string :junk-allowed t))
(format t "~&~A + 1 = ~A" integer (1+ integer))))
¾ÕÀÇ ÆûÀÇ Àǹ̴ ¹®ÀÚ¿µéÀÇ ¸®½ºÆ®·ÎºÎÅÍ Â÷·Ê·Î ¹®ÀÚ¿À» maybe-integer-string¿¡ ¹ÙÀεåÇØ ·çÇÁ¸¦ µ¹¸é¼ parse-integer¸¦ Çϴµ¥, ±× °á°ú°¡ ÀÖÀ» ¶§¸¸ 1À» ´õÇØ °á°ú¸¦ ÇÁ¸°Æ®Ç϶ó´Â °ÍÀÌ´Ù. ¸ÅÅ©·Î dolist·Î ½ÃÀÛÇÏ´Â ½ºÆä¼È ÆûÀº bind-when ¸ÅÅ©·Î, ÇÔ¼ö parse-integer¿Í formatÀ» »ç¿ëÇÑ´Ù.
ÀÌ»ó°ú °°ÀÌ »ìÆìº» ½ºÆä¼È ¿ÀÆÛ·¹ÀÌÅÍ, ¸ÅÅ©·Î, ÇÔ¼ö´Â CLÀÇ Áß¿äÇÑ ±¸¼º¿ä¼Òµé·Î ´ÙÀ½°ú °°Àº Â÷À̰¡ ÀÖ´Ù.
[1] ½ºÆä¼È ¿ÀÆÛ·¹ÀÌÅÍ·Î ½ÃÀÛÇÏ´Â ÆûÀº ¹Ì¸® Á¤ÇØÁø ±ÔÄ¢¿¡ µû¶ó Æò°¡µÈ´Ù. ÇÁ·Î±×·¡¸Ó´Â »õ·Î¿î ½ºÆä¼È ¿ÀÆÛ·¹ÀÌÅ͸¦ Á¤ÀÇÇÒ ¼ö ¾ø´Ù.
[2] ¸ÅÅ©·Î·Î ½ÃÀÛÇÏ´Â Æû ¿ª½Ã ¹Ì¸® Á¤ÇØÁø ±ÔÄ¢¿¡ µû¶ó Æò°¡µÈ´Ù. ÇÁ·Î±×·¡¸Ó´Â »õ·Î¿î ¸ÅÅ©·Î¸¦ Á¤ÀÇÇÒ ¼ö ÀÖÀ¸¸ç, Á¤ÀÇµÈ ¸ÅÅ©·Î´Â ÀÌ¹Ì ½Ã½ºÅÛ¿¡ Á¸ÀçÇÏ´Â ¸ÅÅ©·Î¿Í Â÷º°ÀÌ ¾ø´Ù.
[3] ÇÔ¼ö·Î ½ÃÀÛÇÏ´Â ÆûÀº ÇÔ¼ö È£Ãâ·Î ÀÎÀÚµéÀÌ ¸ðµÎ Æò°¡µÈ ÈÄ¿¡ ÇÔ¼ö È£ÃâÀÌ ÀϾÙ. ÇÁ·Î±×·¡¸Ó´Â »õ·Î¿î ÇÔ¼ö¸¦ Á¤ÀÇÇÒ ¼ö ÀÖÀ¸¸ç, Á¤ÀÇµÈ ÇÔ¼ö´Â ½Ã½ºÅÛ¿¡ ÀÌ¹Ì Á¸ÀçÇÏ´Â ÇÔ¼ö¿Í Â÷º°ÀÌ ¾ø´Ù.
[1]°ú [2]´Â °ÅÀÇ µ¿ÀÏÇϹǷÎ, [2]¿Í [3]À» CLHS¿¡¼ ºñ±³ÇØ º¸±â·Î ÇÑ´Ù. ¾ÕÀÇ ¿¹¿¡¼ ¸ÅÅ©·Î when°ú ÇÔ¼ö 1+¸¦ Áß½ÉÀ¸·Î »ìÆìº¸ÀÚ. CLHS¿¡ Á¤ÀÇµÈ ¸ÅÅ©·Î when°ú ÇÔ¼ö 1+, °¢°¢ÀÇ ¹®¹ýÀ» º¸¸é ´ÙÀ½°ú °°´Ù.
Macro WHEN
Syntax:
when test-form form* => result*
Function 1+
Syntax:
1+ number => successor
À¢¸¸ÇÑ °³¹ßÀÚ¶ó¸é ¾ÕÀÇ ¹®¹ý Á¤Àǰ¡ ¾î¶² Àǹ̸¦ °®´ÂÁö ÁüÀÛÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¸ÅÅ©·Î whenÀº ÇϳªÀÇ test-form°ú 0°³ ÀÌ»óÀÇ formÀ» ¹Þ¾Æµé¿© 0°³ ÀÌ»óÀÇ °á°ú¸¦ ¸®ÅÏÇÑ´Ù. ÇÔ¼ö 1+ÀÇ °æ¿ì¿¡´Â ÇϳªÀÇ number¸¦ ¹Þ¾Æ¼ ÇϳªÀÇ successor¸¦ ¸®ÅÏÇÑ´Ù. ¾ÕÀÇ ¹®¹ý Á¤ÀÇ ºÎºÐ¿¡¼´Â Æò°¡ ¼ø¼¿¡ ´ëÇØ¼´Â ³ª¿Í ÀÖÁö ¾Ê´Ù. ÇÔ¼öÀÇ °æ¿ì´Â Ç×»ó ÀÎÀÚµéÀÌ Æò°¡µÈ ÈÄ ½ÇÁ¦ ÇÔ¼ö°¡ È£ÃâµÇ±â ¶§¹®¿¡ Æò°¡ ¼ø¼¿Í ±ÔÄ¢À» ÇÔ¼ö¸¶´Ù ¼³¸íÀ» ´Þ Çʿ䰡 ¾ø´Ù. ¿¹¸¦ µé¸é, (1+ (1+ (1+ 3)))Àº °¡Àå ³»ºÎÀÇ 1+ ÆûÀ» ½ÃÀÛÇØ¼ ¹Ù±ùÂÊ 1+ÆûÀ» Â÷·Ê·Î È£ÃâÇØ Æò°¡ÇÑ´Ù. ÇÏÁö¸¸ when°ú °°Àº ¸ÅÅ©·Î´Â Ưº°ÇÑ ±ÔÄ¢¿¡ µû¶ó Æò°¡ÇØ¾ß ÇÑ´Ù.
(when (not (zerop number-of-classes))
(/ sum-of-marks number-of-classes))
¾ÕÀÇ ¿¹¿¡¼ ¸¸ÀÏ ÇÔ¼öó·³ ³»ºÎ¿¡¼ºÎÅÍ ÆûÀÌ Æò°¡µÈ´Ù¸é, zerop ÇÔ¼ö È£Ãâ·Î number-of-classesÀÇ ¼ö¸¦ °Ë»çÇϱâ Àü¿¡ ÀÌ¹Ì ¡°/¡± ÇÔ¼ö°¡ È£ÃâµÇ¾î number-of-classes°¡ 0ÀÎ °æ¿ì ¿¡·¯°¡ ¹ß»ýÇÒ °ÍÀÌ´Ù. ±×·¸°Ô ¶§¹®¿¡ ¸ðµç ½ºÆä¼È ¿ÀÆÛ·¹ÀÌÅÍ¿Í ¸ÅÅ©·ÎÀÇ °æ¿ì¿¡´Â CLHS¿¡ ÆûÀÇ Æò°¡ ¼ø¼¿¡ ´ëÇÑ ±ÔÄ¢ÀÌ ÀÖÀ¸¸ç, whenÀÇ °æ¿ì ´ÙÀ½°ú °°ÀÌ ±ÔÄ¢ÀÌ ¸í½ÃµÇ¾î ÀÖ´Ù(½ÇÁ¦ CLHS¿¡¼ ºÒÇÊ¿äÇÑ ºÎºÐÀ» ÆíÁýÇ߱⠶§¹®¿¡ ³»¿ëÀÌ ½ÇÁ¦¿Í´Â ¾à°£ ´Ù¸£´Ù).
when allows the execution of forms to be dependent on a single test-form.
In a when form if the test-form yields true, the forms are evaluated in order from left to right and the values returned by the forms are returned from the when form. Otherwise, if the test-form yields false, the forms are not evaluated, and the when form returns nil.
CL °³¹ßÀÚ´Â CLHS¸¦ Àд ¹ý¿¡ ´ëÇØ Àͼ÷ÇØ¾ß Çϸç, ÂüÁ¶ÇÒ ¶§´Â ƯÈ÷ ½ºÆä¼È ¿ÀÆÛ·¹ÀÌÅÍ, ¸ÅÅ©·Î, ÇÔ¼ö µîÀÇ ¿©ºÎ¿¡ µû¶ó Ưº°ÇÑ ±ÔÄ¢ ºÎºÐ¿¡ À¯³äÇØ ³»¿ëÀ» ÆÄ¾ÇÇØ¾ß ÇÑ´Ù.
ÀÌ·± ½ºÆä¼È ¿ÀÆÛ·¹ÀÌÅͳª ¸ÅÅ©·Î¿Í °°ÀÌ ÇÁ·Î±×·¡¸Ó°¡ ±â¾ïÇØ¾ß ÇÒ ¿ä¼ÒµéÀÌ ¸¹Àº ÇÁ·Î±×·¡¹Ö ¾ð¾îµéÀº Àͼ÷ÇØÁö±â°¡ ½±Áö ¾Ê´Ù. CLÀº ´ÙÇàÈ÷µµ ¾Õ¿¡¼ ³ª¿ÇÑ 18°³ÀÇ ½ºÆä¼È ¿ÀÆÛ·¹ÀÌÅÍ¿Í ¸ÅÅ©·Î Á¤µµ¸é ÃæºÐÈ÷ ÇÁ·Î±×·¡¹ÖÀ» ½ÃÀÛÇÒ ¼ö ÀÖ´Ù. ¹°·Ð ÇÁ·Î±×·¡¸Ó°¡ ÀÚ½ÅÀÇ ¸ñÀûÀ» À§ÇØ ½º½º·Î Á¤ÀÇÇϴ ǥÁØ ÀÌ¿ÜÀÇ ¸ÅÅ©·Î´Â ½º½º·Î ±â¾ïÇϱ⠽¬¿ï °ÍÀÌ´Ù.
CL·Î °³¹ßÇÏ´Â ÇÁ·Î±×·¡¸Ó´Â ¸ÅÅ©·Î¸¦ ÀÛ¼ºÇϱâ À§Çؼ´Â ÀÌ¹Ì CL Ç¥ÁØ¿¡ Á¸ÀçÇÏ´Â ¸ÅÅ©·ÎµéÀÌ ¾î¶² ½ÄÀ¸·Î ±ÔÄ¢À» °®´Â°¡¸¦ Àß ÆÄ¾ÇÇÑ ÈÄ ±×µé°ú À¯»çÇÑ ÇüÅ·Π¸ÅÅ©·Î¸¦ Á¤ÀÇÇÏ´Â °ÍÀÌ ÁÁ´Ù. ¿¹¸¦ µé¸é, CL¿¡¼ ÈçÈ÷ ¸ÅÅ©·Î¸¦ »ç¿ëÇÏ´Â ¿¹ Áß Çϳª°¡ ÄÁÅØ½ºÆ®¸¦ ¼³Á¤ÇÏ´Â °ÍÀε¥, ÀÌ·± ¸ÅÅ©·ÎÀÇ °æ¿ì ¡°with-" µîÀ¸·Î ½ÃÀÛÇϸç, ÄÁÅØ½ºÆ®¿¡¼ »ç¿ëÇÒ º¯¼öµéÀ» ¹ÙÀεùÇÏ°Ô µÈ´Ù.
(with-parameter-binding-to-persistent-object (user-name user-id address)
;; bind µÈ user-name, user-id, address µîÀ» »ç¿ëÇÑ´Ù.
)
ÀÌ»óÀÇ ³»¿ëÀº CL ÇÁ·Î±×·¡¹Ö Ã¥¿¡¼ ÈçÈ÷ ³ªÅ¸³ªÁö ¾ÊÁö¸¸, Áß¿äÇÑ ³»¿ëÀ̹ǷΠÁö¸éÀ» ÅëÇØ °Á¶Çß´Ù. ³ª¸ÓÁö´Â µ¶ÀÚ ¿©·¯ºÐÀÇ ¸òÀ¸·Î CL ÇÁ·Î±×·¡¹Ö ÀÔ¹®¼ µîÀ» ¾à ÇÑ´Þ µ¿¾È Âü°íÇÏ¸é¼ ½º½º·Î CL¿¡ Àͼ÷ÇØÁöµµ·Ï ³ë·ÂÇϱ⠹ٶõ´Ù.
»õ·Î¿î °ø°£¿¡¼ Á¤º¸ °øÀ¯¸¦
CL ÇÁ·Î±×·¡¹Ö¿¡ ´ëÇØ ¸¹Àº À̾߱⸦ ÇÏÁö ¸øÇÑ °Í °°¾Æ¼ ¾Æ½¬¿òÀÌ ³²Áö¸¸, Á¦´ë·Î CL ÇÁ·Î±×·¡¹ÖÀ» Çϱâ À§ÇÑ Áغñ¸¦ ÇÏ´Â °ÍÀÌ ´õ Áß¿äÇÏ´Ù°í »ý°¢Çß´Ù. ù ȸ¸¦ ÅëÇØ ¸¹Àº µ¶ÀÚµéÀÌ ³²Àº 2, 3ȸÀÇ ¿¬À縦 Á¦´ë·Î ¼ÒÈÇÒ ¼ö ÀÖ´Â ±âȸ¸¦ °®±â¸¦ °í´ëÇÑ´Ù. ´Ù½Ã Çѹø °Á¶ÇÏÁö¸¸ ½º½º·Î Àû±ØÀûÀ¸·Î ¹è¿ì°í ÀÍÈ÷Áö ¾ÊÀ¸¸é °áÄÚ ¼öÁØ ³ôÀº °³¹ßÀÚ°¡ µÇ±â Èûµé´Ù. ÀÌÁ¦´Â ÀÎÅͳÝÀÇ ¹ß´Þ·Î ¿øÇÑ´Ù¸é ¾ó¸¶µçÁö ÇÊ¿äÇÑ Á¤º¸¸¦ ±¸ÇÒ ¼ö ÀÖ´Â ½Ã´ë°¡ µÇ¾ú±â ¶§¹®¿¡ µ¶ÀÚ ½º½º·Î ¾ó¸¶³ª ³ë·ÂÇϴ°¡ ¿©ºÎ¿¡ µû¶ó ¹Ì·¡¿¡ Å« Â÷À̸¦ ¸¸µé¾î ³¾ ¼ö ÀÖ´Ù.
¸¶Áö¸·À¸·Î CL¿¡ ´ëÇÑ Áú¹®À̳ª ÀǰßÀº ´Ù¸¥ »ç¶÷µé°ú ÇÔ²² °øÀ¯ÇÒ ¼ö ÀÖµµ·Ï Çѱ¹¸®½À»ç¿ëÀÚ¸ðÀÓÀ» ÀÌ¿ëÇØ Áֱ⠹ٶõ´Ù. ƯÈ÷ ¾ÕÀ¸·Î ÇÑ´Þ¿¡ Çѹø Á¤µµ Á÷Á¢ ¸¸³ª¼ ¼·Î ÀǰßÀ̳ª ÆÁ µîÀÇ Á¤º¸¸¦ ³ª´©°Å³ª ¼¼¹Ì³ª µîÀ» ÅëÇØ ¼·Î °æÇèÀ» ÁÖ°í¹ÞÀ» ¼ö ÀÖ´Â Á¤±â ¸ðÀÓÀ» ÁغñÇϰí ÀÖÀ¸¹Ç·Î °ü½É ÀÖ´Â µ¶ÀÚµéÀÇ ¸¹Àº Âü¿©¸¦ ±â´ëÇÑ´Ù. ÀÌ ±Û ÀÚü¿¡ ´ëÇÑ ³»¿ëÀº Çѱ¹¸®½À»ç¿ëÀÚ¸ðÀÓ¿¡ ÀÖ´Â ¡®ÃÖÁ¾¿ø¡¯À¸·Î °Ë»öÇÏ¸é ¹ß°ßÇÒ ¼ö ÀÖ´Â ÇÊÀÚÀÇ ÆäÀÌÁö¸¦ ÀÌ¿ëÇØ ÁÙ °ÍÀ» ´çºÎÇÑ´Ù. @
* ÀÌ ±â»ç´Â ZDNet KoreaÀÇ ÀÚ¸ÅÁöÀÎ ¸¶ÀÌÅ©·Î¼ÒÇÁÆ®¿þ¾î¿¡ °ÔÀçµÈ ³»¿ëÀÔ´Ï´Ù.