ÀΰøÁö´É ¾ð¾î : L I S P
Àü¹®°¡ ½Ã½ºÅÛ ¿ø¸®¿Í °³¹ß : ÀÌÀç±Ô, ÃÖÇü¸², ±èÇö¼ö, ¼¹Î¼ö, ÁÖ¼®Áø, Áö¿øÃ¶ °øÀú, ¹ý¿µ»ç, 1996, Page 169~190
LISPÀº LISt Processor¿Í µ¿ÀǾî·Î¼ ½Éº¼(Symbol)µé·Î ±¸¼ºµÈ ¸®½ºÆ®(List)µéÀ» ½±°Ô Á¶ÀÛÇÒ ¼ö ÀÖ´Â ¾ð¾îÀÌ´Ù. LISPÀº MacLISP, Inter LISP, Franz LISP µîÀÇ ¸¹Àº ¹æ¾ð(Dialects)µéÀÌ ÀÖ´Ù. À̵éÀº ±âº»ÀûÀΠƯ¼ºµéÀ» °øÀ¯Çϰí ÀÖÀ¸³ª ¿©·¯ ¸é¿¡¼ ¼·Î°¡ »ó´çÈ÷ ´Ù¸£´Ù. Áö±Ý±îÁö ³Î¸® ¾²À̰í ÀÖ´Â LISPÀÇ ¹æ¾ðÀ¸·Î´Â MIT ¿¡¼ °³¹ßÇÑ MacLISP °ú Bolt, Beranek, Newman µî ¼¼ »ç¶÷ÀÌ Xerox Palo Alto Research Center ¿Í ´õºÒ¾î °³¹ßÇÑ Inter LISP ÀÌ ÀÖ´Ù. À̿ܿ¡µµ U.C. Berkeley ¿¡¼ MacLISP À» ¹ÙÅÁÀ¸·Î °³¹ßÇÑ Franz LISP µîÀÌ ÀÖ´Ù. ÀÌ·¯ÇÑ LISP ¹æ¾ðÀ» Ç¥ÁØÈÇϰíÀÚ ÇÏ´Â ³ë·ÂÀÌ ¼ö³â¿¡ °ÉÃÄ Áö¼ÓµÇ¾ú°í, ±× °á°ú Common LISPÀÌ ÃâÇöÇÏ°Ô µÇ¾ú´Ù. À̸¦ °è±â·Î ƯÁ¤ ¹æ¾ðÀ¸·Î ¾º¾îÁø ÇÁ·Î±×·¥Àº ƯÁ¤ ÄÄÇ»ÅÍ¿¡¼¸¸ ¼öÇà °¡´ÉÇß¾ú´ø ¹®Á¦µéÀÌ ÇØ°áµÇ´Â °è±â°¡ µÇ¾ú´Ù. ±×·¯³ª ¾ÆÁ÷°¡Áö LISP »ç¿ëÀÚµéÀÌ ¸ðµÎ Common LISPÀ» »ç¿ëµÇ°í ÀÖÁö´Â ¾ÊÁö¸¸ »ê¾÷, Á¤ºÎ±â°ü, ´ëÇаú ¿¬±¸¼Ò µî¿¡¼ Á¡Â÷ ÀϹÝȵǴ Ãß¼¼ÀÌ´Ù.
±×·¯¸é ¿ì¼± ´ÙÀ½ÀÇ ¿¹¸¦ ÅëÇÏ¿© LISPÀÌ ¾î¶»°Ô »ç¿ëµÉ ¼ö ÀÖ´ÂÁö »ìÆìº¸°í, ÀÌ¾î¼ LISP¿¡ ´ëÇØ ÀÚ¼¼È÷ »ìÆìº¸±â·Î ÇÏÀÚ. Áø¼úÇÑ ¹Ù ÀÖ´Â µ¿¹°ÀÇ Æ¯¼ºÀ» º¸°í ±×°ÍÀÌ ¾î¶² µ¿¹°ÀÎÁö ¸ÂÈ÷´Â ¹®Á¦¸¦ »ý°¢ÇÏ¿© º¸ÀÚ. ¿¹¸¦ µé¾î, "³¯¾Æ´Ù´Ï°í ¾ËÀ» ³º´Â´Ù¸é ¾î¶² µ¿¹°Àΰ¡"¶ó´Â ¹°À½¿¡ ´ëÇÏ¿© ¿ì¸®´Â ±×°ÍÀÌ »õ¶ó´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. ÀÌ´Â ´ÙÀ½°ú °°Àº ±ÔÄ¢ÀÇ ÇüÅ·ΠǥÇöµÉ ¼ö ÀÖ´Ù.
IF ³´Ù.
AND
¾ËÀ» ³º´Â´Ù.
THEN »õÀÌ´Ù.
ÀÌ·¯ÇÑ ±ÔÄ¢À» LISPÀ¸·Î´Â ¾î¶»°Ô Ç¥ÇöÇÒ ¼ö Àִ°¡? LISPÀ¸·Î Ç¥ÇöµÈ ´ÙÀ½ÀÇ µ¿¹°½Äº° ±ÔÄ¢º£À̽º´Â °ýÈ£¿Í SETQ µî ¸î °³ÀÇ LISP ±¸¹®µé·Î µÇ¾î ÀÖ´Ù. ÈļúÇÏ´Â LISP¿¡ ´ëÇÑ ¼³¸íÀ» ¼÷ÁöÇÑ ÈÄ À̰ÍÀ» ´Ù½Ã À½¹ÌÇØ º¸±â ¹Ù¶õ´Ù.
(SETQ
RULES
'((RULE
ID1
(IF
(animal has hair))
(THEN
(animal is mammal)))
(RULE
ID2
(IF
(animal gives milk))
(THEN
(animal is mammal)))
(RULE
ID3
(IF
(animal has feathers))
(THEN
(animal is bird)))
(RULE
ID4
(IF
(animal flies)
(animal lays eggs))
(THEN
(animal is bird)))
(RULE
ID5
(IF
(animal is mammal)
(animal eats meat))
(THEN
(animal is carnivore)))
(RULE ID6
(IF
(animal is mammal)
(animal has pointed teeth)
(animal has claw)
(animal has forward eyes))
(THEN
(animal is carnivore)))
(RULE ID7
(IF
(animal is mammal)
(animal has hoofs))
(THEN
(animal is ungulate)))
(RULE
ID8
(IF
(animal is mammal)
(animal chews cud))
(THEN
(animal is ungulate)))
(RULE
ID9
(IF
(animal is carnivore)
(animal has tawny color)
(animal has dark spots))
(THEN
(animal is cheetah)))
(RULE
ID10
(IF
(animal is carnivore)
(animal has tawny color)
(animal has black stripes))
(THEN
(animal is tiger)))
(RULE
ID11
(IF
(animal is ungulate)
(animal has long neck)
(animal has long legs)
(animal has dark spots))
(THEN
(animal is giraffe)))
(RULE
ID12
(IF
(animal is ungulate)
(animal has black stripes))
(THEN
(animal is zebra)))
(RULE
ID13
(IF
(animal is bird)
(animal does not fly)
(animal has long neck)
(animal has long legs)
(animal is black and white))
(THEN
(animal is ostrich)))
(RULE
ID14
(IF
(animal is bird)
(animal does not fly)
(animal swims)
(animal is black and white))
(THEN
(animal is penguin)))
(RULE
ID15
(IF
(animal is bird)
(animal flys well))
(THEN
(animal is albatross)))))
LISPÀº ¾ÆÅè(Atom)°ú ¸®½ºÆ®(List)¶ó´Â µÎ Á¾·ùÀÇ ´ë»óÀ» ´Ù·é´Ù. ¾ÆÅèÀº ¼ýÀÚ³ª »ç¶÷, »ç¹°, °³³ä µî°ú °°Àº ´ë»óÀ» Ç¥ÇöÇÒ ¶§ »ç¿ëµÇ´Â ½Éº¼(Symbol)À» ¸»ÇÑ´Ù. ¸®½ºÆ®´Â °ýÈ£·Î µÑ·¯½Î¿© ÀÖ´Â ¿ø¼Òµé·Î ±¸¼ºµÇ¾î ÀÕÀ¸¸ç, ¿ø¼Ò´Â ¾ÆÅèÀ̰ųª ¸®½ºÆ®·Î µÇ¾î ÀÖ´Ù.
1 ½Éº¼(Symbol)
½Éº¼ÀÇ ³»ºÎÇ¥ÇöÀº ´ÙÀ½°ú °°´Ù.
½Éº¼¸í(name) |
½Éº¼°ª(value cell) |
ÇÔ¼ö(function) |
¼Ó¼º ¸®½ºÆ®(property list) |
ÆÐŰÁö(package) |
(1) ½Éº¼¸í(Name)
¸ðµç
½Éº¼µéÀº ÁöĪÇÒ ¼ö ÀÕ´Â À̸§À» °¡Áö°í ÀÖ´Ù. ¾î¶² ½Éº¼ÀÌ "FOO"¶ó°í
ÇÏ´Â À̸§À» °¡Áö°í ÀÖ´Ù¸é ÀÌ´Â ½Éº¼¸í¶õ¿¡ ´ÙÀ½°ú °°ÀÌ Ç¥ÇöµÈ´Ù.
(2) ½Éº¼°ª(Value Cell)
½Éº¼°ªÀº
½Éº¼¿¡ ÀÇÇØ À̸§ÀÌ ºÙ¿©Áø º¯¼ö(Variable)ÀÇ °ªÀ» °¡¸®Å²´Ù. ´ÙÀ½ÀÇ ¿¹¸¦ »ìÆìº¸ÀÚ.
ÀÌÇÏÀÇ ¿¹¿¡¼ »ç¿ëµÇ´Â "*" ±âÈ£´Â LISP ÀÎÅÍÇÁ¸®ÅÍ»óÀÇ ÇÁ·ÒÇÁÆ®¸¦ ÀǹÌÇÑ´Ù.
(¿¹)
*
FOO
ERROR :
unbounded variable
FOO¿¡ ¾î¶² °ªµµ ÇÒ´çµÇ¾î ÀÖÁö ¾ÊÀ¸¹Ç·Î unbounded variableÀ̶õ ¿¡·¯ ¸Þ½ÃÁö°¡ ³ª¿Â´Ù. ¸¸ÀÏ FOO¿¡ elmer¶ó´Â °ªÀ» ÇÒ´çÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ Ç¥ÇöÇÏ¸é µÈ´Ù.
*
(setq foo 'elmer)
ELMER
FOO¿¡ elmer°¡ ÇÒ´çµÇ¾ú´Ù.
µû¶ó¼ FOO°ªÀ» º¸¸é,
*
FOO
ELMER
¿Í °°ÀÌ ³ª¿Â´Ù. À̰ÍÀº ½Éº¼°ª¶õ¿¡ ´ÙÀ½°ú °°ÀÌ Ç¥ÇöµÈ´Ù.
(3) ÇÔ¼ö(Function)
LISP˼
Á¤ÀÇµÈ ÇÔ¼ö¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍ(Pointer)¸¦ °¡Áö°í ÀÖ´Ù. ¿¹¸¦ µé¾î, "+"¶ó´Â
½Éº¼ÀÌ ´õÇÏ´Â ±â´ÉÀ» °¡Áø ÇÔ¼ö·Î Á¤ÀǵǷÁ¸é ½Éº¼¸í¿¡´Â "+"·Î, ±×°ÍÀÇ
ÇÔ¼ö´Â ÇÔ¼ö¶õ¿¡¼ ´ÙÀ½°ú °°ÀÌ Á¤ÀǵȴÙ.
(4) ¼Ó¼º ¸®½ºÆ®(Property List)
¼Ó¼º
¸®½ºÆ®¶õ¿¡´Â ÈÀÏ¸í µî ½Éº¼¿¡ ´ëÇÑ ±âŸÀÇ Á¤º¸¸¦ ÀúÀåÇϰí ÀÖ´Ù.
(5) ÆÐŰÁö(Package)
ÆÐŰÁö¿¡´Â
Ä¿´Ù¶õ ÇÁ·Î±×·¥¿¡ ÀÖ´Â ¼·Î ´Ù¸¥ ¸ðµâµé°£¿¡ »ý±æ ¼ö ÀÖ´Â ¸íĪÀÇ È¥¶õÀ» ¹æÁöÇØ
ÁÖ´Â Á¤º¸¸¦ °¡Áö°í ÀÖ´Ù.
2. ¼ýÀÚ(Number)
¼ýÀÚ´Â Ç×»ó ±× ÀÚüÀÇ °ªÀ¸·Î Æò°¡µÈ´Ù. ¼ýÀÚ¸¦ Á¶ÀÛÇÒ ¼ö ÀÖ´Â »ê¼úÇÔ¼ö´Â ´ÙÀ½°ú °°Àº °ÍµéÀÌ ÀÖ´Ù. Áï, +, -, *, /ÀÇ »çÄ¢¿¬»ê°ú 1+, 1- µî Çϳª¾¿ Áõ°¡½ÃŰ°Å³ª °¨¼Ò½ÃŰ´Â µî ±âº»¿¬»êÀÌ °¡´ÉÇÑ ÇÔ¼öµéÀÌ´Ù.
(¿¹)
*
(+3 5) =>
8
* (-100 7) =>
93
* (* 2 3) =>
6
* (/ 99 3) =>
33
* (1 + 5) =>
6
* (1 - 5) =>
4
* (+2 (* 4 5)) =>
22
* (/ (* 6 7) (-5.0 2))) =>
14.0
¿©±â¼ "+"¿Í "*"´Â Àμö(Arguments)·Î ¾î¶² ¼öµµ °¡´ÉÇÏ´Ù. ¹Ý¸é¿¡ "-"¿Í "/"´Â Àμö(Argument)·Î 0ÀÌ ¾Æ´Ñ ¼ö°¡ °¡´ÉÇÏ´Ù.
(¿¹)
*
(+ 1 2 3 4 5) => 15
*
(/ 120 3.0 4 2) => 5.0
1. ÇÔ¼öÀÇ Á¤ÀÇ : DEFUN
DEFUNÀº »õ·Î¿î ÇÔ¼ö¸¦ Á¤ÀÇÇϱâ À§ÇÑ Æ¯¼öÇüÀÌ´Ù. »ç½Ç, LISP ÇÁ·Î±×·¥Àº Á¤ÀÇµÈ »ï¼öµéÀÇ ÁýÇÕÀ¸·Î º¼ ¼ö ÀÖ´Ù. µû¶ó¼ LISP ÇÁ·Î±×·¡¹ÖÀº ÇÔ¼ö¸¦ Çϳª¾¿ Á¤ÀÇÇϰí Å×½ºÆ®ÇÏ¸é¼ Á¡ÁõÀûÀ¸·Î ÇÁ·Î±×·¥ÀÇ ±Ô¸ð°¡ Ä¿Áö´Â ¹æ½ÄÀ¸·Î ÁøÇàµÈ´Ù. °£´ÜÇÑ ¿¹·Î "half"¶ó´Â ÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ Á¤ÀÇÇÒ ¼ö ÀÖ´Ù.
(¿¹)
*
(defun half (n) (/ n 2))
¿©±â¼, "("´Â LISP Ç¥ÇöÀÇ ½ÃÀÛ, "defun"Àº ÇÔ¼ö¸¦ Á¤ÀÇÇϱâ À§ÇÑ Æ¯¼öÇü, "half"´Â ÇÔ¼ö¸í, "(n)"´Â Àμö¸®½ºÆ®, "(/ n 2)"´Â ÇÔ¼ö¸öü, ")"´Â ÇÔ¼öÀÇ ³¡À» °¡¸®Å²´Ù.
2. ÇÔ¼öÀÇ Å×½ºÆ®
À§¿¡¼ Á¤ÀÇµÈ "half" ÇÔ¼ö¸¦ ¼öÇà½ÃÄÑ º¸±â·Î ÇÏÀÚ. ´ÙÀ½Àº LISP ÀÎÅÍÇÁ¸®ÅÍ¿¡¼ ´ÙÀ½°ú °°ÀÌ Ç¥ÇöµÇ¾úÀ» °æ¿ì¿¡ ¼öÇàÇÑ °á°úÀÌ´Ù.
*
(half 8)
4
*
(+ 7 (half 10))
12
º¯¼ö´Â ƯÁ¤ ÇÔ¼ö ³»¿¡¼¸¸ È¿·ÂÀ» °®´Â(»ç¿ëµÇ´Â) Áö¿ªº¯¼ö¿Í ¸ðµç ÇÔ¼ö¿¡ °ÉÃÄ È¿·ÂÀ» °®´Â Àü¿ªº¯¼ö·Î ³ª´ ¼ö ÀÖ´Ù.
1. Áö¿ªº¯¼ö(Local Variable)
ÇÔ¼ö half¿¡¼ º¯¼ö nÀº Áö¿ªº¯¼öÀÌ´Ù. ¿Ö³ÄÇϸé nÀÌ ÇÔ¼ö half ³»¿¡¼¸¸ Á¸ÀçÇϱ⠶§¹®ÀÌ´Ù.
2. Àü¿ªº¯¼ö(Global Variable)
´ÙÀ½ÀÇ ¿¹¿¡¼ "weight"´Â Àü¿ªº¯¼öÀÌ´Ù.
*
(setq weight 120)
* (defun
eat-a-pie ( )
(setq
weight (1+ weight)) 'yum)
*
weight => 120
*
(eat-a-pie) => yum
*
(eat-a-pie) => yum
*
weight => 122
¿©±â¼ ÇÔ¼öÈ£ÃâÀÌ °è¼ÓµÇ´Â µ¿¾È µ¥ÀÌÅ͸¦ ÀúÀåÇϰí ÀÕ´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù.
"Evaluation" À̶õ LISP Ç¥ÇöÀÌ °á°ú°ªÀ¸·Î º¯È¯µÇ´Â °úÁ¤ÀÌ´Ù. ¿¹¸¦ µé¾î, ¸®½ºÆ® '(+ 3 5)'´Â LISP Ç¥ÇöÀÌ°í °á°ú°ªÀº '8'ÀÌ´Ù. Evaluation ±ÔÄ¢Àº ´ÙÀ½°ú °°Àº °ÍÀÌ ÀÖ´Ù.
±ÔÄ¢ 1 : ¼ýÀÚ´Â Ç×»ó ±× ÀÚü·Î
evaluation µÈ´Ù.
(¿¹)
1Àº 1·Î evaluation µÈ´Ù.
±ÔÄ¢ 2 : ½Éº¼Àº ±×°ÍÀÌ °¡¸®Å°´Â
º¯¼öÀÇ °ªÀ¸·Î evaluationµÈ´Ù.
(¿¹) (setq x 9)¸¦ evaluation ÇÑ ÈÄ x¸¦ º¸¸é 9·Î evaluationµÈ´Ù.
±ÔÄ¢
3 : quote µÈ °ÍÀº quote°¡ ºüÁø °ÍÀ¸·Î evaluation µÈ´Ù.
(¿¹) '(+ 3 5)´Â (+ 3 5)·Î evaluation µÈ´Ù.
±ÔÄ¢
4 : ¸®½ºÆ®¸¦ evaluationÇÏ·Á¸é ¸®½ºÆ®ÀÇ Ã¹¹øÂ° ¿ø¼Ò´Â ¹Ýµå½Ã ÇÔ¼ö ¶Ç´Â Ư¼öÇüÀÌ
µÇ¾î¾ß ÇÑ´Ù.
(¿¹)
(defun average (n m)
(half (+ n m)))¸¦ Á¤ÀÇÇÑ ÈÄ,
(average (+ 3 5)(* 6 2))´Â 10À¸·Î evaluation µÈ´Ù.
1. Æ÷ÀÎÅÍ(Pointer)¶õ ¹«¾ùÀΰ¡?
Cons CellÀÌ ¹«¾ùÀÎÁö ¾Ë±â Àü¿¡ ¿ì¼± Æ÷ÀÎÅͰ¡ ¹«¾ùÀÎÁö ¾Ë¾Æº¸±â·Î ÇÏÀÚ. Æ÷ÀÎÅÍ´Â ÁÖ¼Ò(Address)¸¦ ³ªÅ¸³»¸ç º¸Åë È»ìÇ¥·Î Ç¥½ÃÇÑ´Ù. ¿¹¸¦ µé¾î, ½Éº¼Àº ´Ù¼¸ °³ÀÇ Æ÷ÀÎÅÍ·Î ±¸¼ºµÇ¾î ÀÖÀ¸¸ç ½Éº¼¸í, ½Éº¼°ª, ÇÔ¼ö, ¼Ó¼º ¸®½ºÆ®, ÆÐŰÁö ¼¿(Cell)¿¡ ÀúÀåµÇ¾î ÀÖ´Ù. Æ÷ÀÎÅÍ·Î ±¸¼ºµÈ ÇϳªÀÇ LISP µ¥ÀÌÅÍ À¯ÇüÀ¸·Î Cons CellÀÌ ÀÖ´Ù. Cons CellÀº Ç×»ó µÎ °³ÀÇ Æ÷ÀÎÅ͸¦ Áö´Ï°í ÀÖ´Ù.
¸¸ÀÏ ½Éº¼ ABC¿Í ¼ýÀÚ 100À» °¡¸®Å°´Â Æ÷ÀÎÅ͸¦ Áö´Ñ Cons CellÀº ´ÙÀ½°ú °°ÀÌ ³ªÅ¸³¾ ¼ö ÀÖ´Ù.
2. Cons Cell üÀÎ(Chain)
Cons Cell üÀÎÀ̶õ Cons CellÀÌ »ç½½(Chain)¸ð¾çÀ¸·Î ¿¬°áµÇ¾î ÀÖ´Â °ÍÀ» ¸»ÇÑ´Ù. Cons Cell üÀÎÀº ´ÙÀ½°ú °°Àº Ư¼ºÀ» °¡Áö°í ÀÖ´Ù. ù°, ¸¶Áö¸·À» Á¦¿ÜÇÑ °¢ ¼¿ÀÇ CDR ºÎºÐÀº üÀο¡¼ ´ÙÀ½ ¼¿À» °¡Áö°í ÀÖ´Ù. ù°, ¸¶Áö¸·À» Á¦¿ÜÇÑ °¢ ¼¿ÀÇ CDR ºÎºÐÀº üÀο¡¼ ´ÙÀ½ ¼¿À» °¡¸®Å²´Ù. µÑ°, ¸¶Áö¸· ¼¿ÀÇ CDRÀº Ç×»ó NILÀ» °¡¸®Å²´Ù. NILÀº º¸Åë LISP¿¡¼ üÀÎÀÇ ³¡À» ÀǹÌÇÑ´Ù. ¼Â°, üÀο¡¼ °¢ ¼¿ÀÇ CAR ºÎºÐÀº º¸Åë µ¥ÀÌÅ͸¦ °¡¸®Å²´Ù.
3. Cons Cell°ú °ü·ÃµÇ ÇÔ¼ö
(1) LIST ÇÔ¼ö
LIST´Â
»õ·Î¿î Cons Cell üÀÎÀ» ¸¸µé±â À§ÇÑ ÇÔ¼öÀ̸ç ÀμöÀÇ ¼ö¿¡´Â Á¦ÇÑÀÌ ¾ø´Ù. ¿¹¸¦
µé¾î, (list 'foo 'bar 'baz)·Î Ç¥ÇöµÈ LIST ÇÔ¼ö´Â ´ÙÀ½°ú °°Àº Cons Cell üÀÎÀ»
Çü¼ºÇÑ´Ù.
(2) CONS ÇÔ¼ö
CONS´Â
Cons Cell ±¸Á¶¸¦ ¸¸µé¸ç µÎ °³ÀÇ Àμö¸¸À» °¡Áú ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, (cons 'left
'right)·Î Ç¥ÇöµÈ CONS ÇÔ¼ö´Â ´ÙÀ½°ú °°Àº Cons CellÀ» Çü¼ºÇÑ´Ù.
(3) APPEND ÇÔ¼ö
APPEND´Â
µÚÀÇ Ã¼ÀÎÀ» º¹»çÇÏ¿© ¾ÕÀÇ Ã¼Àο¡ ºÙÀÓÀ¸·Î½á ±ä üÀÎÀ» ¸¸µå´Â ÇÔ¼öÀÌ´Ù. ¿¹¸¦
µé¾î, x°¡ (here today), y°¡ (gone tomorrow)¶ó´Â ¶ó½ºÆ®¶ó Çϸé (append x y)´Â
(here today gone tomorrow)·Î °á°ú°ªÀÌ ³ª¿Â´Ù.
(4) REVERSE ÇÔ¼ö
REVERSE´Â
Cons Cell üÀÎÀ» °Å²Ù·Î µÚÁý´Â ÇÔ¼öÀÌ´Ù. ¿¹¸¦ µé¾î, (reverse '(a b c d))´Â (d
c b a)¸¦ °á°ú°ªÀ¸·Î Ãâ·ÂÇÑ´Ù.
(5) LAST ÇÔ¼ö
LAST´Â
¸¶Áö¸· Cons CellÀ» ³»º¸³»´Â ÇÔ¼öÀÌ´Ù. ¿¹¸¦ µé¾î, (last '(a b c d))´Â ¸¶Áö¸·
¿ø¼ÒÀÎ "d"ÀÇ ¶ó½ºÆ® (d)¸¦ °á°ú°ªÀ¸·Î Ãâ·ÂÇÑ´Ù.
(6) LENGTH ÇÔ¼ö
LENGTH´Â
Cons Cell üÀÎÀÇ ¿ø¼ÒÀÇ °³¼ö¸¦ ³»º¸³»´Â ÇÔ¼öÀÌ´Ù. ¿¹¸¦ µé¾î, (length '(a b c
d))´Â Cons Cell üÀÎ ¿ø¼ÒÀÇ °³¼ö 4¸¦ °á°ú°ªÀ¸·Î Ãâ·ÂÇÑ´Ù.
(7) NTHCDR°ú NTH
À̵éÀº
¸®½ºÆ®ÀÇ Æ¯Á¤ CDR ¶Ç´Â ¿ø¼Ò¸¦ ÃßÃâÇØ ³»´Â ÇÔ¼öÀÌ´Ù. ¿¹¸¦ µé¾î, (nthcdr n x)´Â
X¿¡ ´ëÇØ n¹øÀÇ ¿¬¼ÓÀûÀÎ CDRÀ» Àû¿ëÇÑ °á°ú°ªÀ» Ãâ·ÂÇÑ´Ù. Áï, (nthcdr 2 '(a b
c d))´Â (c d)¸¦ °á°ú°ªÀ¸·Î ³»º¸³½´Ù. ¶ÇÇÑ (nth n x)´Â 0ºÎÅÍ ¼¼¾î ¸®½ºÆ® xÀÇ
n° ¿ø¼Ò°ªÀ» Ãâ·ÂÇÑ´Ù. Áï, (nth 2 '(a b c d))´Â c¸¦ °á°ú°ªÀ¸·Î Ãâ·ÂÇÑ´Ù.
1. CAR ¿Í CDR
CAR(ÀϹÝÀûÀ¸·Î "Ä«"·Î ¹ßÀ½ÇÔ)¿Í CDR(ÀϹÝÀûÀ¸·Î "Å©´õ"·Î ¹ßÀ½ÇÔ) ÇÔ¼ö´Â Cons Cell¿¡¼ °¢°¢ car¿Í cdr Æ÷ÀÎÅ͸¦ ²ôÁý¾î³»´Â ÇÔ¼öÀÌ´Ù. ¿¹¸¦ µé¾î, (car '(A B C))´Â ¸®½ºÆ®ÀÇ Ã¹¹øÂ° ¿ø¼ÒÀÎ A, (cdr '(A B C))´Â ù¹øÂ° ¿ø¼Ò¸¦ Á¦¿ÜÇÑ ¸®½ºÆ® (B C)¸¦ °á°ú°ªÀ¸·Î Ãâ·ÂÇÑ´Ù. ¶ÇÇÑ car¿Í °°Àº ±â´ÉÀ» °¡Áø ÇÔ¼ö·Î first, cdr°ú °°Àº ±â´ÉÀ» °¡Áø ÇÔ¼ö·Î rest°¡ ÀÖ´Ù.
2. second~tenth ÇÔ¼ö
¸®½ºÆ®¿¡¼ ƯÁ¤ À§Ä¡¿¡ ÀÖ´Â ¿ø¼Ò¸¦ ²ôÁý¾î ³»±â À§ÇÑ °ÍÀ¸·Î second ºÎÅÍ tenth ±îÁöÀÇ ÇÔ¼ö°¡ ÀÖ´Ù. second ÇÔ¼ö¸¦ first(car)¿Í rest(cdr)¸¦ »ç¿ëÇÏ¿© ´ÙÀ½°ú °°ÀÌ Á¤ÀÇ ÇÒ ¼ö ÀÖ´Ù.
*
(defun second (x)
(first (rest)))
* (defun
second (x)
(car (cdr x)))
1. IF Ư¼öÇü
IF Á¶°Ç¹®Àº ´ÙÀ½°ú °°Àº ±¸¹®À» °¡Áö°í ÀÖ´Ù.
(IF test then else) |
¿¹¸¦ µé¾î, 100º¸´Ù Å©¸é big,
ÀÛÀ¸¸é smallÀ̶ó´Â °á°ú°ªÀ» Ãâ·ÂÇÏ´Â ÇÔ¼ö¸¦ IF¹®À» »ç¿ëÇÏ¿© Á¤ÀÇÇÏ¿© º¸¸é ´ÙÀ½°ú
°°´Ù.
*
(defun big-number (x)
(IF
(> x 100) 'big 'small))
*
(big-number 37) => SMALL
*
(big-number 175) => BIG
(IF test then)°ú °°ÀÌ elseºÎºÐÀÌ »ý·«µÈ °æ¿ì´Â (IF test then NIL)°ú °°´Ù.
2. AND/OR Á¶°Ç¹®
AND¿Í OR Á¶°Ç¹®Àº ÇØ´ç Àý(Clause)µéÀ» ¿ÞÂÊ¿¡¼ ¿À¸¥ÂÊÀ¸·Î Çѹø¿¡ ÇÑ °³¾¿ evaluationÇÑ´Ù. AND´Â ÀýÀÌ NIL·Î evaluationµÇ¸é ¸ØÃ߸ç, À̶§ NIL °ªÀ» Ãâ·ÂÇÑ´Ù. ±×·¸Áö ¾ÊÀº °æ¿ì¿¡´Â ¸¶Áö¸· ÀýÀÇ °ªÀ» Ãâ·ÂÇÑ´Ù. OR´Â ù¹øÂ°·Î NILÀÌ ¾Æ´Ñ °ªÀ» ã¾Æ Ãâ·ÂÇÑ´Ù. ±×·¸Áö ¾ÊÀº °æ¿ì´Â NILÀ» Ãâ·ÂÇÑ´Ù.
3. COND Ư¼öÇü
COND Á¶°Ç¹®Àº ´ÙÀ½°ú °°Àº ±¸¹®À» °¡Áö°í ÀÖ´Ù.
(COND (cond-1 action-1) |
À̰ÍÀº Á¶°Ç¹®À» ¸¸Á·ÇÏ´Â °á°ú°ªÀÌ ¿©·¯ °¡Áö·Î ³ªÅ¸³¯ °æ¿ì ƯÁ¤ Á¶°Ç¿¡ µû¸¥ °á°ú°ªÀ» º¸°íÀÚ ÇÒ ¶§ »ç¿ëµÈ´Ù.
(¿¹)
*
(defun my-where-is (x)
(cond
((equal x 'seoul) 'KOREA)
(equal x 'washington) 'USA)))
*
(my-where-is 'seoul) => KOREA
´ÙÀ½°ú °°Àº condÀÇ Ç¥ÇöÀ» IF ¹®À¸·Î Ç¥½ÃÇÏ¸é ´ÙÀ½°ú °°´Ù.
*
(cond (test-1 act-1)
(test-2
act-2)
(t
act-3)))
* (IF test-1 act-1
(IF test-2 act-2 act-3))
4. Á¶°ÇÀ¸·Î¼ÀÇ T
t¸¦ °¡Áø ÀýÀº ±×°ÍÀÌ ¼öÇàµÉ Â÷·Ê°¡ µÇ¸é ¹Ýµå½Ã ¼öÇàµÈ´Ù.
(¿¹)
*
(defun make-even (x)
(cond
((doop x) (1+x)
(t x)))
5. ´ÙÁß½ÇÇ๮À» °¡Áø Àý
¸¸ÀÏ COND ÀýÀÌ Çϳª ÀÌ»óÀÇ ½ÇÇ๮À» °¡Áø °æ¿ì¿¡´Â ¸ðµç ½ÇÇ๮ÀÌ evaluation µÇ°í ¸¶Áö¸· ½ÇÇ๮ÀÇ °ªÀ» Ãâ·ÂÇÑ´Ù.
(¿¹)
*
(defun multi-action (x)
(cond ((eq x 'load)
(setq action-state 1)
'act-1)
((eq x 'unload)
(setq action-state 0)
'act-0)
(t nil)))
*
(multi-action 'load) => act-1
*
action-state => 1
½ºÆ®¸²Àº µ¥ÀÌÅÍÀÇ ¹ß»ý¿øÃµÀ̳ª Á¾Âø¿ªÇÒÀ» ÇÏ´Â °ÍÀ¸·Î ÈÀϰúÀÇ ¿¬°áÀ» ³ªÅ¸³½´Ù.
1. Ç¥ÁؽºÆ®¸²
*standard-input* : ÀÔ·ÂÇÔ¼ö
READ¿Í °°ÀÌ ½ºÆ®¸²Àμö°¡ ¾øÀ» °æ¿ì¿¡ »ç¿ëµÇ´Â ÀԷ½ºÆ®¸²ÀÌ´Ù.
*standard-output*
: Ãâ·ÂÇÔ¼ö PRINT¿Í °°ÀÌ ½ºÆ®¸²Àμö°¡ ¾øÀ» °æ¿ì¿¡ »ç¿ëµÇ´Â Ãâ·Â½ºÆ®¸²ÀÌ´Ù.
*eooro-output*
: ¿¡·¯¸Þ½ÃÁö°¡ º¸³»Áö´Â ½ºÆ®¸²ÀÌ´Ù.
*terminal-io* : Űº¸µå¿Í
Ç×»ó ¿¬°áµÇ¾î ÀÖ´Â ½ºÆ®¸²ÀÌ´Ù.
*query-io* : ÇÁ·Î±×·¥ ¼öÇàÁß¿¡
ÇÊ¿äÇÑ °æ¿ì »ç¿ëÀÚ¿¡°Ô ÁúÀÇÇϱâ À§ÇÑ ½ºÆ®¸²ÀÌ´Ù.
2. READ ÇÔ¼ö
ÀԷ½ºÆ®¸²À¸·ÎºÎÅÍ LISPÀ¸·Î Ç¥ÇöµÈ °ÍµéÀ» Àд ÇÔ¼öÀÌ´Ù.
*
(read) foo
=> FOO
*
(read) (let us take a break)
=> (let us take a break)
3. ¹®ÀÚ¿(Character String)
¹®ÀÚ¿Àº Ç×»ó " "·Î ´ÝÇô ÀÖÀ¸¸ç ±× ÀÚü·Î evaluation µÈ´Ù.
(¿¹)
*
"This is a string" => "This is a string"
*
(stringp "AI") => t
4. FORMAT ÇÔ¼ö
FORMAT ÇÔ¼ö´Â ¹®ÀÚ¿À» ¸¸µé¾î ÁÖ¸ç, ±×°ÍÀ» ½ºÆ®¸²À¸·Î ¸¸µé±âµµ ÇÑ´Ù.
(¿¹)
*
(format t "This is a string") This is a string
NIL
* (format nil "This
is a string")
"This
is a string"
¿©±â¼ FORMAT¹® ´ÙÀ½¿¡ tÀÎ °æ¿ì´Â *standard-output* ½ºÆ®¸², nilÀÎ °æ¿ì´Â ¹®ÀÚ¿À» Ãâ·ÂÇÑ´Ù.
5. ~s ¸í·É¾î
~s¹®Àº ¹®ÀÚ¿ ¾È¿¡ LISP object¸¦ ÀμâÇÑ ÇüÅ·ΠÁý¾î ³Ö´Â´Ù.
(¿¹)
*
(format t "~% see ~s and ~s." 'DICK 'JANE)
*
see DICK and JANE.
* NIL
¼øÈ¯ÇÔ¼ö¶õ ½º½º·Î¸¦ È£ÃâÇÏ´Â ÇÔ¼öÀÌ´Ù. ¿¹¸¦ µé¾î ´ÙÀ½°ú °°Àº ÇÔ¼öÀÇ °æ¿ì¸¦ º¸±â·Î ÇÏÀÚ.
*
(defun count-down (x)
(cond
((zerop x) 0)
(t
(count-down (1-x)))))
ÀÌ ÇÔ¼ö´Â Àμö(Argument)¸¦ 1¾¿ ÁÙÀÌ¸é¼ ½º½º·Î¸¦ È£ÃâÇϰí ÀÖ´Ù. ¼øÈ¯ template´Â ´ÙÀ½°ú °°Àº Çü½ÄÀ» °®´Â´Ù.
(DEFUN func (x) |
À§ÀÇ ÇÔ¼ö¸¦ ´ëÀÀ½ÃÄÑ º¸¸é ´ÙÀ½°ú °°´Ù.
func :
count-down
end-test :
zerop
end-value :
0
reduce :
1-
1. ¼øÈ¯ÇÔ¼ö ÀÛ¼º ±ÔÄ¢
¼øÈ¯ÇÔ¼ö¸¦ ÀÛ¼ºÇÒ ¶§ À¯ÀÇÇÒ Á¡Àº ´ÙÀ½°ú °°´Ù.
±ÔÄ¢ 1 : ¾ðÁ¦ ¸ØÃß¾î¾ß ÇÒ °ÍÀΰ¡¸¦
¾Ë¾Æ¾ß ÇÑ´Ù. |
(¿¹)
*
(defun count-element (x)
(cond ((null x) 0)
(t (+1 (count-element (rest x))))))
*
(count-element '(A B))
¸ÅÅ©·Î´Â º¹ÀâÇÏ°Ô ÇÁ·Î±×·¡¹Ö µÉ ¼ö ÀÖ´Â °ÍÀ» À¯¿¬ÇÏ°Ô Ç¥ÇöÇÒ ¼ö ÀÖµµ·Ï ÇÏ¿©ÁØ´Ù. ¸ÅÅ©·Î´Â µÎ ´Ü°è·Î ³ª´©¾î ÁøÇàµÈ´Ù. ù´Ü°è¿¡¼´Â ¼öÇà °¡´ÉÇÑ Áß°£ÇüÅÂÀÇ ÀÏ·ÃÀÇ Äڵ带 »ý¼ºÇØ ³»°í, µÑ° ´Ü°è¿¡¼´Â ÀÌ Äڵ带 evaluationÇÏ¿© ¸ÅÅ©·ÎÀÇ °á°ú°ªÀ¸·Î ¸¸µé¾î ³½´Ù. Áï, LISP ÀÎÅÍÇÁ¸®ÅͰ¡ ¸ÅÅ©·Î¿¡¼´Â µÎ ¹ø evaluationÀ» ÇÑ´Ù°í º¼ ¼ö ÀÖ´Ù.
1. LET ¸ÅÅ©·Î
LET ¸ÅÅ©·Î´Â Áö¿ªº¯¼ö¸¦ binding Çϴµ¥ »ç¿ëµÇ¸ç, ´ÙÀ½°ú °°Àº ±¸¹®À» °¡Áö°í ÀÖ´Ù.
(LET ((var-1 value-1) |
¾Æ·¡ÀÇ ¿¹¿¡¼ Áö¿ªº¯¼ö y´Â rev¶ó´Â ÇÔ¼ö ³»¿¡¼¸¸ Àǹ̰¡ ÀÖ´Ù.
*
(defun rev (x)
(let
((y (reverse x)))
(list
(first y) (second y))))
*
(rev '(a b c d))
=>
(d c)
2. LET* ¸ÅÅ©·Î
LETÀÌ º´·Ä·Î º¯¼ö¸¦ binding ÇÏ´Â µ¥¿¡ ´ëÇÏ¿© LET* ¸ÅÅ©·Î´Â ¼øÂ÷ÀûÀ¸·Î º¯¼ö¸¦ binding ÇÑ´Ù. ´ÙÀ½ÀÇ ¿¹´Â LET°ú LET*°£ÀÇ Â÷À̸¦ º¸¿© ÁÖ°í ÀÖ´Ù.
*
(setq x 'grape)
* (let ((a
x)
(b
a))
(list
a b) => ERROR : An unbouned variable
*
(let* ((a x)
(b a))
(list a b)) => (grape grape)
1. DOTIMES ¸ÅÅ©·Î
DOTIMES ¸ÅÅ©·Î´Â n¹ø ¹Ýº¹Çؼ ó¸®ÇÏ°í ½ÍÀ» ¶§ »ç¿ëÇϸç, ±¸¹®Àº ´ÙÀ½°ú °°´Ù.
(DOTIMES (var n result) |
´ÙÀ½Àº x¹ø Ƚ¼ö¸¸Å HelloÇϰí Stop!À¸·Î ³¡À» ¸Î°íÀÚ ÇÒ ¶§ÀÇ ¿¹ÀÌ´Ù.
*
(defun say-hello (x)
(dotimes
(i x 'Stop!)
(format
t "~% Hello ~s" i)))
*
(say-hello 3)
Hello
0
Hello 1
Hello 2
Stop!
2. DOLIST ¸ÅÅ©·Î
DOLIST ¸ÅÅ©·Î´Â ¸®½ºÆ® ¾È¿¡ ÀÖ´Â ¿ø¼Ò ÇϳªÇϳª¿¡ ´ëÇÏ¿© ¹Ýº¹ÀûÀ¸·Î 󸮸¦ ÇÒ ¶§ »ç¿ëÇÑ´Ù. ´ÙÀ½Àº ¸®½ºÆ® ¾È¿¡ ÀÖ´Â ¿ø¼Ò ÇϳªÇϳª¿¡ ´ëÇÏ¿© HelloÇÏ°í ¸¶Áö¸·¿¡ Stop!À̶ó Ãâ·ÂÇÏ´Â ¿¹ÀÌ´Ù.
(DOLIST (var list result) |
(¿¹)
*
(defun say-hello-to (x)
(dolist (p x 'Stop!)
(format "~% Hello ~s!" p)))
*
(say-hello-to '(Sally Dick Jane))
Hello Sally!
Hello
Dick!
Hello Jane!
Stop!
3. DO ¸ÅÅ©·Î
DO ¸ÅÅ©·Î´Â ¿©·¯ º¯¼ö¿¡ ´ëÇØ
ÃʱⰪÀ» ÁÖ°í ÀÏÁ¤ ¾ç¸¸Å Áõ°¨½ÃŰ¸é¼ ¹Ýº¹Ã³¸® ÇÒ ¶§ »ç¿ëÇÏ¸ç ±¸¹®Àº ´ÙÀ½°ú
°°´Ù.
(DO ((var-1 init-1
step-1) |
´ÙÀ½Àº DO¸¦ »ç¿ëÇÑ ¿¹ÀÌ´Ù.
(¿¹)
*
(defun add-up (list-of-numbers)
(do ((x list-of-numbers (cdr x))
(result nil)
(sum 0 (+sum (car x))))
((null
x) sum)
(push (list
(car x) result))))
¸¸ÀÏ ¿¬¼ÓÀûÀÎ bindingÀ» ÇÏ·Á¸é DO ´ë½Å DO*¸¦ »ç¿ëÇÑ´Ù.