ÀΰøÁö´É ¾ð¾î : L I S P

 

Àü¹®°¡ ½Ã½ºÅÛ ¿ø¸®¿Í °³¹ß : ÀÌÀç±Ô, ÃÖÇü¸², ±èÇö¼ö, ¼­¹Î¼ö, ÁÖ¼®Áø, Áö¿øö °øÀú, ¹ý¿µ»ç, 1996, Page 169~190

 

LISPÀ̶õ ¹«¾ùÀΰ¡?

LISP µ¥ÀÌÅÍ Å¸ÀÔ

ÇÔ ¼ö

º¯ ¼ö

LISP Evaluator

Cons Cell ±¸Á¶

¸®½ºÆ®(List) ±¸Á¶ÀÇ ºÐÇØ

Á¶°Ç¹® (Conditionals)

½ºÆ®¸²(Streams)

¼øȯÇÔ¼ö(Recursion)

¸ÅÅ©·Î(Macro)

¹Ýº¹¹®

 

LISPÀ̶õ ¹«¾ùÀΰ¡?

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 µ¥ÀÌÅÍ Å¸ÀÔ

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

¿©±â¼­ ÇÔ¼öÈ£ÃâÀÌ °è¼ÓµÇ´Â µ¿¾È µ¥ÀÌÅ͸¦ ÀúÀåÇÏ°í ÀÕ´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù.

LISP Evaluator

"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 µÈ´Ù. 

Cons Cell ±¸Á¶

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¸¦ °á°ú°ªÀ¸·Î Ãâ·ÂÇÑ´Ù.

¸®½ºÆ®(List) ±¸Á¶ÀÇ ºÐÇØ

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)))

Á¶°Ç¹® (Conditionals)

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)
            (cond-2  action-2)
                 ...
            (cond-n action-3))

ÀÌ°ÍÀº Á¶°Ç¹®À» ¸¸Á·ÇÏ´Â °á°ú°ªÀÌ ¿©·¯ °¡Áö·Î ³ªÅ¸³¯ °æ¿ì ƯÁ¤ Á¶°Ç¿¡ µû¸¥ °á°ú°ªÀ» º¸°íÀÚ ÇÒ ¶§ »ç¿ëµÈ´Ù.

   (¿¹)
        * (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

½ºÆ®¸²(Streams)

½ºÆ®¸²Àº µ¥ÀÌÅÍÀÇ ¹ß»ý¿øõÀ̳ª Á¾Âø¿ªÇÒÀ» ÇÏ´Â °ÍÀ¸·Î È­ÀÏ°úÀÇ ¿¬°áÀ» ³ªÅ¸³½´Ù. 

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

¼øȯÇÔ¼ö(Recursion)

¼øȯÇÔ¼ö¶õ ½º½º·Î¸¦ È£ÃâÇÏ´Â ÇÔ¼öÀÌ´Ù. ¿¹¸¦ µé¾î ´ÙÀ½°ú °°Àº ÇÔ¼öÀÇ °æ¿ì¸¦ º¸±â·Î ÇÏÀÚ.

        * (defun count-down (x)
            (cond ((zerop x) 0)
                (t (count-down (1-x)))))

ÀÌ ÇÔ¼ö´Â Àμö(Argument)¸¦ 1¾¿ ÁÙÀ̸鼭 ½º½º·Î¸¦ È£ÃâÇÏ°í ÀÖ´Ù. ¼øȯ template´Â ´ÙÀ½°ú °°Àº Çü½ÄÀ» °®´Â´Ù.

 (DEFUN func (x)
    (COND ((end-test x) end-value)
              (T (func (reduce x)))))

À§ÀÇ ÇÔ¼ö¸¦ ´ëÀÀ½ÃÄÑ º¸¸é ´ÙÀ½°ú °°´Ù.

        func            : count-down
        end-test        : zerop
        end-value       : 0
        reduce          : 1-

1. ¼øȯÇÔ¼ö ÀÛ¼º ±ÔÄ¢

¼øȯÇÔ¼ö¸¦ ÀÛ¼ºÇÒ ¶§ À¯ÀÇÇÒ Á¡Àº ´ÙÀ½°ú °°´Ù.

±ÔÄ¢ 1 : ¾ðÁ¦ ¸ØÃß¾î¾ß ÇÒ °ÍÀΰ¡¸¦ ¾Ë¾Æ¾ß ÇÑ´Ù.
             (¿¹) count-downÀÇ °æ¿ì 0 ÀÏ ¶§ ¸ØÃá´Ù.
 ±ÔÄ¢ 2 : ¸Å¹ø È£Ã⸶´Ù ±Ô¸ð¸¦ Á¡Â÷ ÀÛ°Ô ÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀ» »ý°¢ÇØ¾ß ÇÑ´Ù.
             (¿¹) x -> (1- x)
 ±ÔÄ¢ 3 : ¸Å¹ø È£Ã⸶´Ù Ç®¾ú´ø ¹®Á¦ÀÇ °á°úµéÀ» ÇÕÃÄ ¿ø·¡ÀÇ ¹®Á¦¿¡ ´ëÇÑ
             ÇØ´äÀ» ¾òÀ» ¼ö ÀÖ¾î¾ß ÇÑ´Ù.

   (¿¹)
        * (defun count-element (x)
             (cond ((null x) 0)
                 (t (+1 (count-element (rest x))))))
        * (count-element '(A B))
         

¸ÅÅ©·Î(Macro)

¸ÅÅ©·Î´Â º¹ÀâÇÏ°Ô ÇÁ·Î±×·¡¹Ö µÉ ¼ö ÀÖ´Â °ÍÀ» À¯¿¬ÇÏ°Ô Ç¥ÇöÇÒ ¼ö ÀÖµµ·Ï ÇÏ¿©ÁØ´Ù. ¸ÅÅ©·Î´Â µÎ ´Ü°è·Î ³ª´©¾î ÁøÇàµÈ´Ù. ù´Ü°è¿¡¼­´Â ¼öÇà °¡´ÉÇÑ Áß°£ÇüÅÂÀÇ ÀÏ·ÃÀÇ Äڵ带 »ý¼ºÇØ ³»°í, µÑ° ´Ü°è¿¡¼­´Â ÀÌ Äڵ带 evaluationÇÏ¿© ¸ÅÅ©·ÎÀÇ °á°ú°ªÀ¸·Î ¸¸µé¾î ³½´Ù. Áï, LISP ÀÎÅÍÇÁ¸®ÅÍ°¡ ¸ÅÅ©·Î¿¡¼­´Â µÎ ¹ø evaluationÀ» ÇÑ´Ù°í º¼ ¼ö ÀÖ´Ù.

1. LET ¸ÅÅ©·Î

LET ¸ÅÅ©·Î´Â Áö¿ªº¯¼ö¸¦ binding Çϴµ¥ »ç¿ëµÇ¸ç, ´ÙÀ½°ú °°Àº ±¸¹®À» °¡Áö°í ÀÖ´Ù.

  (LET ((var-1  value-1)
           (var-2  value-2)
                 ...
           (var-n  value-n))
    body)

¾Æ·¡ÀÇ ¿¹¿¡¼­ Áö¿ªº¯¼ö 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)
      (body))

´ÙÀ½Àº 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)
       body)

   (¿¹)
        * (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)
                     ...
          (var-n  init-n  step-n)
          (test action-1  ...  action-n)
      (body)

´ÙÀ½Àº 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*¸¦ »ç¿ëÇÑ´Ù.