10 12, 2004

LispÖ®¸ùÔ´

±£ÂÞ¸ñÀ×¶òÄ·

Ô¼º²Âó¿¨ÎýÓÚ1960Äê·¢±íÁËһƪ·Ç·²µÄÂÛÎÄ,ËûÔÚÕâÆªÂÛÎÄÖжԱà³ÌµÄ¹±Ï×ÓÐÈçÅ·¼¸ÀïµÂ¶Ô¼¸ºÎµÄ¹±Ï×.1 ËûÏòÎÒÃÇչʾÁË,ÔÚÖ»¸ø¶¨¼¸¸ö¼òµ¥µÄ²Ù×÷·ûºÍÒ»¸ö±íʾº¯ÊýµÄ¼ÇºÅµÄ»ù´¡ÉÏ, ÈçºÎ¹¹Ôì³öÒ»¸öÍêÕûµÄ±à³ÌÓïÑÔ. Âó¿¨Îý³ÆÕâÖÖÓïÑÔΪLisp, ÒâΪList Processing, ÒòΪËûµÄÖ÷Ҫ˼ÏëÖ®Ò»ÊÇÓÃÒ»ÖÖ¼òµ¥µÄÊý¾Ý½á¹¹±í(list)À´´ú±í´úÂëºÍÊý¾Ý.


ÖµµÃ×¢ÒâµÄÊÇ,Âó¿¨ÎýËù×÷µÄ·¢ÏÖ,²»½öÊǼÆËã»úÊ·ÉÏ»®Ê±´úµÄ´óÊÂ, ¶øÇÒÊÇÒ»ÖÖÔÚÎÒÃÇÕâ¸öʱ´ú±à³ÌÔ½À´Ô½Ç÷ÏòµÄģʽ.ÎÒÈÏΪĿǰΪֹֻÓÐÁ½ÖÖÕæÕý¸É¾»ÀûÂä, ʼÖÕÈçÒ»µÄ±à³Ìģʽ:CÓïÑÔģʽºÍLispÓïÑÔģʽ.´Ë¶þÕß¾ÍÏóÁ½×ù¸ßµØ, ÔÚËüÃÇÖмäÊÇÓÈÈçÕÓÔóµÄµÍµØ.Ëæ×żÆËã»ú±äµÃÔ½À´Ô½Ç¿´ó,пª·¢µÄÓïÑÔÒ»Ö±ÔڼᶨµØÇ÷ÏòÓÚLispģʽ. ¶þÊ®ÄêÀ´,¿ª·¢Ð±à³ÌÓïÑÔµÄÒ»¸öÁ÷ÐеÄÃØ¾öÊÇ,È¡CÓïÑԵļÆËãģʽ,Öð½¥µØÍùÉϼÓLispģʽµÄÌØÐÔ,ÀýÈçÔËÐÐʱÀàÐͺÍÎÞÓõ¥ÔªÊÕ¼¯.

ÔÚÕâÆªÎÄÕÂÖÐÎÒ¾¡¿ÉÄÜÓÃ×î¼òµ¥µÄÊõÓïÀ´½âÊÍÔ¼º²Âó¿¨ÎýËù×öµÄ·¢ÏÖ. ¹Ø¼üÊÇÎÒÃDz»½öҪѧϰij¸öÈËËÄÊ®ÄêǰµÃ³öµÄÓÐȤÀíÂÛ½á¹û, ¶øÇÒչʾ±à³ÌÓïÑԵķ¢Õ¹·½Ïò. LispµÄ²»Í¬Ñ°³£Ö®´¦--Ò²¾ÍÊÇËüÓÅÖʵ͍Òå--ÊÇËüÄܹ»×Ô¼ºÀ´±àд×Ô¼º. ΪÁËÀí½âÔ¼º²Âó¿¨ÎýËù±íÊöµÄÕâ¸öÌØµã,ÎÒÃǽ«×·ËÝËûµÄ²½·¥,²¢½«ËûµÄÊýѧ±ê¼Çת»»³ÉÄܹ»ÔËÐеÄCommon Lisp´úÂë.

Æß¸öԭʼ²Ù×÷·û

¿ªÊ¼ÎÒÃÇÏȶ¨Òå±í´ïʽ.±í´ïʽ»òÊÇÒ»¸öÔ­×Ó(atom),ËüÊÇÒ»¸ö×ÖĸÐòÁÐ(Èç foo),»òÊÇÒ»¸öÓÉÁã¸ö»ò¶à¸ö±í´ïʽ×é³ÉµÄ±í(list), ±í´ïʽ֮¼äÓÿոñ·Ö¿ª, ·ÅÈëÒ»¶ÔÀ¨ºÅÖÐ. ÒÔÏÂÊÇһЩ±í´ïʽ:

foo
()
(foo)
(foo bar)
(a b (c) d)
×îºóÒ»¸ö±í´ïʽÊÇÓÉËĸöÔªËØ×é³ÉµÄ±í, µÚÈý¸öÔªËØ±¾ÉíÊÇÓÉÒ»¸öÔªËØ×é³ÉµÄ±í.

ÔÚËãÊõÖбí´ïʽ 1 + 1 µÃ³öÖµ2. ÕýÈ·µÄLisp±í´ïʽҲÓÐÖµ. Èç¹û±í´ïʽeµÃ³öÖµv,ÎÒÃÇ˵e·µ»Øv. ÏÂÒ»²½ÎÒÃǽ«¶¨Ò弸ÖÖ±í´ïʽÒÔ¼°ËüÃǵķµ»ØÖµ.

Èç¹ûÒ»¸ö±í´ïʽÊDZí,ÎÒÃdzƵÚÒ»¸öÔªËØÎª²Ù×÷·û,ÆäÓàµÄÔªËØÎª×Ô±äÁ¿.ÎÒÃǽ«¶¨ÒåÆß¸öԭʼ(´Ó¹«ÀíµÄÒâÒåÉÏ˵)²Ù×÷·û: quote,atom,eq,car,cdr,cons,ºÍ cond.

  1. (quote x) ·µ»Øx.ΪÁ˿ɶÁÐÔÎÒÃǰÑ(quote x)¼ò¼Ç Ϊ'x.

    > (quote a)
    a
    > 'a
    a
    > (quote (a b c))
    (a b c)
    

  2. (atom x)·µ»ØÔ­×ÓtÈç¹ûxµÄÖµÊÇÒ»¸öÔ­×Ó»òÊǿձí,·ñÔò·µ»Ø(). ÔÚLispÖÐÎÒÃǰ´¹ßÀýÓÃÔ­×Ót±íÊ¾Õæ, ¶øÓÿձí±íʾ¼Ù.

    > (atom 'a)
    t
    > (atom '(a b c))
    ()
    > (atom '())
    t
    

    ¼ÈÈ»ÓÐÁËÒ»¸ö×Ô±äÁ¿ÐèÒªÇóÖµµÄ²Ù×÷·û, ÎÒÃÇ¿ÉÒÔ¿´Ò»ÏÂquoteµÄ×÷ÓÃ. ͨ¹ýÒýÓÃ(quote)Ò»¸ö±í,ÎÒÃDZÜÃâËü±»ÇóÖµ. Ò»¸öδ±»ÒýÓõıí×÷Ϊ×Ô±äÁ¿´«¸øÏó atomÕâÑùµÄ²Ù×÷·û½«±»ÊÓΪ´úÂë:

    > (atom (atom 'a))
    t
    

    ·´Ö®Ò»¸ö±»ÒýÓõıí½ö±»ÊÓΪ±í, ÔÚ´ËÀýÖоÍÊÇÓÐÁ½¸öÔªËØµÄ±í:

    > (atom '(atom 'a))
    ()
    

    ÕâÓëÎÒÃÇÔÚÓ¢ÓïÖÐʹÓÃÒýºÅµÄ·½Ê½Ò»ÖÂ. Cambridge(½£ÇÅ)ÊÇÒ»¸öλÓÚÂéÈøÖîÈûÖÝÓÐ90000È˿ڵijÇÕò. ¶ø``Cambridge''ÊÇÒ»¸öÓÉ9¸ö×Öĸ×é³ÉµÄµ¥´Ê.

    ÒýÓÿ´ÉÏÈ¥¿ÉÄÜÓÐµãÆæ¹ÖÒòΪ¼«ÉÙÓÐÆäËüÓïÑÔÓÐÀàËÆµÄ¸ÅÄî. ËüºÍLisp×îÓëÖÚ²»Í¬µÄÌØÕ÷½ôÃÜÁªÏµ:´úÂëºÍÊý¾ÝÓÉÏàͬµÄÊý¾Ý½á¹¹¹¹³É, ¶øÎÒÃÇÓÃquote²Ù×÷·ûÀ´Çø·ÖËüÃÇ.

  3. (eq x y)·µ»ØtÈç¹ûxºÍyµÄÖµÊÇͬһ¸öÔ­×Ó»ò¶¼Êǿձí, ·ñÔò·µ»Ø().

    > (eq 'a 'a)
    t
    > (eq 'a 'b)
    ()
    > (eq '() '())
    t
    

  4. (car x)ÆÚÍûxµÄÖµÊÇÒ»¸ö±í²¢ÇÒ·µ»ØxµÄµÚÒ»¸öÔªËØ.

    > (car '(a b c))
    a
    

  5. (cdr x)ÆÚÍûxµÄÖµÊÇÒ»¸ö±í²¢ÇÒ·µ»ØxµÄµÚÒ»¸öÔªËØÖ®ºóµÄËùÓÐÔªËØ.
    > (cdr '(a b c))
    (b c)
    

  6. (cons x y)ÆÚÍûyµÄÖµÊÇÒ»¸ö±í²¢ÇÒ·µ»ØÒ»¸öбí,ËüµÄµÚÒ»¸öÔªËØÊÇxµÄÖµ, ºóÃæ¸ú×ÅyµÄÖµµÄ¸÷¸öÔªËØ.

    > (cons 'a '(b c))
    (a b c)
    > (cons 'a (cons 'b (cons 'c '())))
    (a b c)
    > (car (cons 'a '(b c)))
    a
    > (cdr (cons 'a '(b c)))
    (b c)
    
  7. (cond ($p_{1}$...$e_{1}$) ...($p_{n}$...$e_{n}$)) µÄÇóÖµ¹æÔòÈçÏÂ. p±í´ïʽÒÀ´ÎÇóÖµÖ±µ½ÓÐÒ»¸ö·µ»Øt. Èç¹ûÄÜÕÒµ½ÕâÑùµÄp±í´ïʽ,ÏàÓ¦µÄe±í´ïʽµÄÖµ×÷ΪÕû¸öcond±í´ïʽµÄ·µ»ØÖµ.

    > (cond ((eq 'a 'b) 'first)
            ((atom 'a)  'second))
    second
    

    µ±±í´ïʽÒÔÆß¸öԭʼ²Ù×÷·ûÖеÄÎå¸ö¿ªÍ·Ê±,ËüµÄ×Ô±äÁ¿×ÜÊÇÒªÇóÖµµÄ.2 ÎÒÃdzÆÕâÑù µÄ²Ù×÷·ûΪº¯Êý.

º¯ÊýµÄ±íʾ

½Ó×ÅÎÒÃǶ¨ÒåÒ»¸ö¼ÇºÅÀ´ÃèÊöº¯Êý.º¯Êý±íʾΪ(lambda ($p_{1}$...$p_{n}$) e),ÆäÖÐ $p_{1}$...$p_{n}$ÊÇÔ­×Ó(½Ð×ö²ÎÊý),eÊDZí´ïʽ. Èç¹û±í´ïʽµÄµÚÒ»¸öÔªËØÐÎʽÈçÉÏ

((lambda ($p_{1}$...$p_{n}$) e) $a_{1}$...$a_{n}$)

Ôò³ÆÎªº¯Êýµ÷ÓÃ.ËüµÄÖµ¼ÆËãÈçÏÂ.ÿһ¸ö±í´ïʽ$a_{i}$ÏÈÇóÖµ,È»ºóeÔÙÇóÖµ.ÔÚeµÄÇóÖµ¹ý³ÌÖÐ,ÿ¸ö³öÏÖÔÚeÖеÄ$p_{i}$µÄÖµÊÇÏàÓ¦µÄ$a_{i}$ÔÚ×î½üÒ»´ÎµÄº¯Êýµ÷ÓÃÖеÄÖµ.

> ((lambda (x) (cons x '(b))) 'a)
(a b)
> ((lambda (x y) (cons x (cdr y)))
   'z
   '(a b c))
(z b c)
Èç¹ûÒ»¸ö±í´ïʽµÄµÚÒ»¸öÔªËØfÊÇÔ­×ÓÇÒf²»ÊÇԭʼ²Ù×÷·û

(f $a_{1}$...$a_{n}$)

²¢ÇÒfµÄÖµÊÇÒ»¸öº¯Êý(lambda ($p_{1}$...$p_{n}$)),ÔòÒÔÉϱí´ïʽµÄÖµ¾ÍÊÇ

((lambda ($p_{1}$...$p_{n}$) e) $a_{1}$...$a_{n}$)

µÄÖµ. »»¾ä»°Ëµ,²ÎÊýÔÚ±í´ïʽÖв»µ«¿ÉÒÔ×÷Ϊ×Ô±äÁ¿Ò²¿ÉÒÔ×÷Ϊ²Ù×÷·ûʹÓÃ:

> ((lambda (f) (f '(b c)))
   '(lambda (x) (cons 'a x)))
(a b c)

ÓÐÁíÍâÒ»¸öº¯Êý¼ÇºÅʹµÃº¯ÊýÄÜÌá¼°Ëü±¾Éí,ÕâÑùÎÒÃǾÍÄÜ·½±ãµØ¶¨ÒåµÝ¹éº¯Êý.3 ¼ÇºÅ

(label f (lambda ($p_{1}$...$p_{n}$) e))

±íʾһ¸öÏó(lambda ($p_{1}$...$p_{n}$) e)ÄÇÑùµÄº¯Êý,¼ÓÉÏÕâÑùµÄÌØÐÔ: ÈκγöÏÖÔÚeÖеÄf½«ÇóֵΪ´Ëlabel±í´ïʽ, ¾ÍºÃÏófÊǴ˺¯ÊýµÄ²ÎÊý.

¼ÙÉèÎÒÃÇÒª¶¨Ò庯Êý(subst x y z), ËüÈ¡±í´ïʽx,Ô­×ÓyºÍ±íz×ö²ÎÊý,·µ»ØÒ»¸öÏózÄÇÑùµÄ±í, ²»¹ýzÖгöÏÖµÄy(ÔÚÈκÎǶÌײã´ÎÉÏ)±»x´úÌæ.

> (subst 'm 'b '(a b (a b c) d))
(a m (a m c) d)
ÎÒÃÇ¿ÉÒÔÕâÑù±íʾ´Ëº¯Êý
(label subst (lambda (x y z)
               (cond ((atom z)
                      (cond ((eq z y) x)
                            ('t z)))
                     ('t (cons (subst x y (car z))
                               (subst x y (cdr z)))))))
ÎÒÃǼò¼Çf=(label f (lambda ($p_{1}$...$p_{n}$) e))Ϊ

(defun f ($p_{1}$...$p_{n}$) e)

ÓÚÊÇ

(defun subst (x y z)
  (cond ((atom z)
         (cond ((eq z y) x)
               ('t z)))
        ('t (cons (subst x y (car z))
                  (subst x y (cdr z))))))
żȻµØÎÒÃÇÔÚÕâ¶ù¿´µ½ÈçºÎдcond±í´ïʽµÄȱʡ×Ó¾ä. µÚÒ»¸öÔªËØÊÇ'tµÄ×Ó¾ä×ÜÊÇ»á³É¹¦µÄ. ÓÚÊÇ

(cond (x y) ('t z))

µÈͬÓÚÎÒÃÇÔÚijЩÓïÑÔÖÐдµÄ

if x then y else z

һЩº¯Êý

¼ÈÈ»ÎÒÃÇÓÐÁ˱íʾº¯ÊýµÄ·½·¨,ÎÒÃǸù¾ÝÆß¸öԭʼ²Ù×÷·ûÀ´¶¨ÒåһЩеĺ¯Êý. ΪÁË·½±ãÎÒÃÇÒý½øÒ»Ð©³£¼ûģʽµÄ¼ò¼Ç·¨. ÎÒÃÇÓÃcxr,ÆäÖÐxÊÇa»òdµÄÐòÁÐ,À´¼ò¼ÇÏàÓ¦µÄcarºÍcdrµÄ×éºÏ. ±ÈÈç(cadr e)ÊÇ(car (cdr e))µÄ¼ò¼Ç,Ëü·µ»ØeµÄµÚ¶þ¸öÔªËØ.

> (cadr '((a b) (c d) e))
(c d)
> (caddr '((a b) (c d) e))
e
> (cdar '((a b) (c d) e))
(b)
ÎÒÃÇ»¹ÓÃ(list $e_{1}$...$e_{n}$)±íʾ(cons $e_{1}$...(cons $e_{n}$'()) ...).
> (cons 'a (cons 'b (cons 'c '())))
(a b c)
> (list 'a 'b 'c)
(a b c)

ÏÖÔÚÎÒÃǶ¨ÒåһЩк¯Êý. ÎÒÔÚº¯ÊýÃûºóÃæ¼ÓÁ˵ã,ÒÔÇø±ðº¯ÊýºÍ¶¨ÒåËüÃǵÄԭʼº¯Êý,Ò²±ÜÃâÓëÏÖ´æµÄcommon LispµÄº¯Êý³åÍ».

  1. (null. x)²âÊÔËüµÄ×Ô±äÁ¿ÊÇ·ñÊǿձí.

    (defun null. (x)
      (eq x '()))
    
    > (null. 'a)
    ()
    > (null. '())
    t
    

  2. (and. x y)·µ»ØtÈç¹ûËüµÄÁ½¸ö×Ô±äÁ¿¶¼ÊÇt, ·ñÔò·µ»Ø().

    (defun and. (x y)
      (cond (x (cond (y 't) ('t '())))
            ('t '())))
    
    > (and. (atom 'a) (eq 'a 'a))
    t
    > (and. (atom 'a) (eq 'a 'b))
    ()
    

  3. (not. x)·µ»ØtÈç¹ûËüµÄ×Ô±äÁ¿·µ»Ø(),·µ»Ø()Èç¹ûËüµÄ×Ô±äÁ¿·µ»Øt.

    (defun not. (x)
      (cond (x '())
            ('t 't)))
    
    > (not. (eq 'a 'a))
    ()
    > (not. (eq 'a 'b))
    t
    

  4. (append. x y)È¡Á½¸ö±í²¢·µ»ØËüÃǵÄÁ¬½á.

    (defun append. (x y)
       (cond ((null. x) y)
             ('t (cons (car x) (append. (cdr x) y)))))
    
    > (append. '(a b) '(c d))
    (a b c d)
    > (append. '() '(c d))
    (c d)
    

  5. (pair. x y)È¡Á½¸öÏàͬ³¤¶ÈµÄ±í,·µ»ØÒ»¸öÓÉË«ÔªËØ±í¹¹³ÉµÄ±í,Ë«ÔªËØ±íÊÇÏàӦλÖõÄx,yµÄÔªËØ¶Ô.

    (defun pair. (x y)
      (cond ((and. (null. x) (null. y)) '())
            ((and. (not. (atom x)) (not. (atom y)))
             (cons (list (car x) (car y))
                   (pair. (cdr) (cdr y))))))
    
    > (pair. '(x y z) '(a b c))
    ((x a) (y b) (z c))
    

  6. (assoc. x y)ȡԭ×ÓxºÍÐÎÈçpair.º¯ÊýËù·µ»ØµÄ±íy,·µ»ØyÖеÚÒ»¸ö·ûºÏÈçÏÂÌõ¼þµÄ±íµÄµÚ¶þ¸öÔªËØ:ËüµÄµÚÒ»¸öÔªËØÊÇx.

    (defun assoc. (x y)
      (cond ((eq (caar y) x) (cadar y))
            ('t (assoc. x (cdr y)))))
    
    > (assoc. 'x '((x a) (y b)))
    a
    > (assoc. 'x '((x new) (x a) (y b)))
    new
    

Ò»¸ö¾ªÏ²

Òò´ËÎÒÃÇÄܹ»¶¨Ò庯ÊýÀ´Á¬½Ó±í,Ìæ»»±í´ïʽµÈµÈ.Ò²ÐíËãÊÇÒ»¸öÓÅÃÀµÄ±íʾ·¨, ÄÇÏÂÒ»²½ÄØ? ÏÖÔÚ¾ªÏ²À´ÁË. ÎÒÃÇ¿ÉÒÔдһ¸öº¯Êý×÷ΪÎÒÃÇÓïÑԵĽâÊÍÆ÷:´Ëº¯ÊýÈ¡ÈÎÒâLisp±í´ïʽ×÷×Ô±äÁ¿²¢·µ»ØËüµÄÖµ. ÈçÏÂËùʾ:

(defun eval. (e a)
  (cond 
    ((atom e) (assoc. e a))
    ((atom (car e))
     (cond 
       ((eq (car e) 'quote) (cadr e))
       ((eq (car e) 'atom)  (atom   (eval. (cadr e) a)))
       ((eq (car e) 'eq)    (eq     (eval. (cadr e) a)
                                    (eval. (caddr e) a)))
       ((eq (car e) 'car)   (car    (eval. (cadr e) a)))
       ((eq (car e) 'cdr)   (cdr    (eval. (cadr e) a)))
       ((eq (car e) 'cons)  (cons   (eval. (cadr e) a)
                                    (eval. (caddr e) a)))
       ((eq (car e) 'cond)  (evcon. (cdr e) a))
       ('t (eval. (cons (assoc. (car e) a)
                        (cdr e))
                  a))))
    ((eq (caar e) 'label)
     (eval. (cons (caddar e) (cdr e))
            (cons (list (cadar e) (car e)) a)))
    ((eq (caar e) 'lambda)
     (eval. (caddar e)
            (append. (pair. (cadar e) (evlis. (cdr  e) a))
                     a)))))

(defun evcon. (c a)
  (cond ((eval. (caar c) a)
         (eval. (cadar c) a))
        ('t (evcon. (cdr c) a))))

(defun evlis. (m a)
  (cond ((null. m) '())
        ('t (cons (eval.  (car m) a)
                  (evlis. (cdr m) a)))))
eval.µÄ¶¨Òå±ÈÎÒÃÇÒÔǰ¿´µ½µÄ¶¼Òª³¤. ÈÃÎÒÃÇ¿¼ÂÇËüµÄÿһ²¿·ÖÊÇÈçºÎ¹¤×÷µÄ.

eval.ÓÐÁ½¸ö×Ô±äÁ¿: eÊÇÒªÇóÖµµÄ±í´ïʽ, aÊÇÓÉһЩ¸³¸øÔ­×ÓµÄÖµ¹¹³ÉµÄ±í,ÕâЩֵÓеãÏóº¯Êýµ÷ÓÃÖеIJÎÊý. Õâ¸öÐÎÈçpair.µÄ·µ»ØÖµµÄ±í½Ð×ö»·¾³. ÕýÊÇΪÁ˹¹ÔìºÍËÑË÷ÕâÖÖ±íÎÒÃDzÅдÁËpair.ºÍassoc..

eval.µÄ¹Ç¼ÜÊÇÒ»¸öÓÐËĸö×Ó¾äµÄcond±í´ïʽ. ÈçºÎ¶Ô±í´ïʽÇóֵȡ¾öÓÚËüµÄÀàÐÍ. µÚÒ»¸ö×Ӿ䴦ÀíÔ­×Ó. Èç¹ûeÊÇÔ­×Ó, ÎÒÃÇÔÚ»·¾³ÖÐѰÕÒËüµÄÖµ:

> (eval. 'x '((x a) (y b)))
a

µÚ¶þ¸ö×Ó¾äÊÇÁíÒ»¸öcond, Ëü´¦ÀíÐÎÈç(a ...)µÄ±í´ïʽ, ÆäÖÐaÊÇÔ­×Ó. Õâ°üÀ¨ËùÓеÄԭʼ²Ù×÷·û, ÿ¸ö¶ÔÓ¦Ò»Ìõ×Ó¾ä.

> (eval. '(eq 'a 'a) '())
t
> (eval. '(cons x '(b c))
         '((x a) (y b)))
(a b c)
Õ⼸¸ö×Ó¾ä(³ýÁËquote)¶¼µ÷ÓÃeval.À´Ñ°ÕÒ×Ô±äÁ¿µÄÖµ.

×îºóÁ½¸ö×Ó¾ä¸ü¸´ÔÓЩ. ΪÁËÇócond±í´ïʽµÄÖµÎÒÃǵ÷ÓÃÁËÒ»¸ö½Ð evcon.µÄ¸¨Öúº¯Êý. ËüµÝ¹éµØ¶Ôcond×Ӿ佸ÐÐÇóÖµ,ѰÕÒµÚÒ»¸öÔªËØ·µ»ØtµÄ×Ó¾ä. Èç¹ûÕÒµ½ÁËÕâÑùµÄ×Ó¾ä, Ëü·µ»Ø´Ë×Ó¾äµÄµÚ¶þ¸öÔªËØ.

> (eval. '(cond ((atom x) 'atom)
                ('t 'list))
         '((x '(a b))))
list

µÚ¶þ¸ö×Ó¾äµÄ×îºó²¿·Ö´¦Àíº¯Êýµ÷ÓÃ. Ëü°ÑÔ­×ÓÌæ»»ÎªËüµÄÖµ(Ó¦¸ÃÊÇlambda »òlabel±í´ïʽ)È»ºó¶ÔËùµÃ½á¹û±í´ïʽÇóÖµ. ÓÚÊÇ

(eval. '(f '(b c))
       '((f (lambda (x) (cons 'a x)))))
±äΪ
(eval. '((lambda (x) (cons 'a x)) '(b c))
       '((f (lambda (x) (cons 'a x)))))
Ëü·µ»Ø(a b c).

eval.µÄ×îºócondÁ½¸ö×Ӿ䴦ÀíµÚÒ»¸öÔªËØÊÇlambda»òlabelµÄº¯Êýµ÷ÓÃ.ΪÁ˶Ôlabel ±í´ïʽÇóÖµ, ÏȰѺ¯ÊýÃûºÍº¯Êý±¾ÉíѹÈë»·¾³, È»ºóµ÷ÓÃeval.¶ÔÒ»¸öÄÚ²¿ÓÐ lambdaµÄ±í´ïʽÇóÖµ. ¼´:

(eval. '((label firstatom (lambda (x)
                            (cond ((atom x) x)
                                  ('t (firstatom (car x))))))
         y)
       '((y ((a b) (c d)))))
±äΪ
(eval. '((lambda (x)
           (cond ((atom x) x)
                 ('t (firstatom (car x)))))
         y)
        '((firstatom
           (label firstatom (lambda (x)
                            (cond ((atom x) x)
                                  ('t (firstatom (car x)))))))
          (y ((a b) (c d)))))
×îÖÕ·µ»Øa.

×îºó,¶ÔÐÎÈç((lambda ($p_{1}$...$p_{n}$) e) $a_{1}$...$a_{n}$)µÄ±í´ïʽÇóÖµ,Ïȵ÷ÓÃevlis.À´ÇóµÃ×Ô±äÁ¿($a_{1}$...$a_{n}$)¶ÔÓ¦µÄÖµ($v_{1}$...$v_{n}$),°Ñ($p_{1}$$v_{1}$)...($p_{n}$$v_{n}$)Ìí¼Óµ½»·¾³Àï, È»ºó¶ÔeÇóÖµ. ÓÚÊÇ

(eval. '((lambda (x y) (cons x (cdr y)))
         'a
         '(b c d))
       '())
±äΪ
(eval. '(cons x (cdr y))
       '((x a) (y (b c d))))
×îÖÕ·µ»Ø(a c d).

ºó¹û

¼ÈÈ»Àí½âÁËevalÊÇÈçºÎ¹¤×÷µÄ, ÈÃÎÒÃǻعýÍ·¿¼ÂÇÒ»ÏÂÕâÒâζ×Åʲô. ÎÒÃÇÔÚÕâ¶ùµÃµ½ÁËÒ»¸ö·Ç³£ÓÅÃÀµÄ¼ÆËãÄ£ÐÍ. ½öÓÃquote,atom,eq,car,cdr,cons,ºÍcond, ÎÒÃǶ¨ÒåÁ˺¯Êýeval.,ËüÊÂʵÉÏʵÏÖÁËÎÒÃǵÄÓïÑÔ,ÓÃËü¿ÉÒÔ¶¨ÒåÈκÎÎÒÃÇÏëÒªµÄ¶îÍâµÄº¯Êý.

µ±È»ÔçÒÑÓÐÁ˸÷ÖÖ¼ÆËãÄ£ÐÍ--×îÖøÃûµÄÊÇͼÁé»ú. µ«ÊÇͼÁé»ú³ÌÐòÄÑÒÔ¶Á¶®. Èç¹ûÄãÒªÒ»ÖÖÃèÊöËã·¨µÄÓïÑÔ, Äã¿ÉÄÜÐèÒª¸ü³éÏóµÄ, ¶øÕâ¾ÍÊÇÔ¼º²Âó¿¨Îý¶¨Òå LispµÄÄ¿±êÖ®Ò».

Ô¼º²Âó¿¨ÎýÓÚ1960Ä궨ÒåµÄÓïÑÔ»¹È±²»ÉÙ¶«Î÷. ËüûÓи±×÷ÓÃ, ûÓÐÁ¬ÐøÖ´ÐÐ (ËüµÃºÍ¸±×÷ÓÃÔÚÒ»Æð²ÅÓÐÓÃ), ûÓÐʵ¼Ê¿ÉÓõÄÊý,4 ûÓж¯Ì¬¿ÉÊÓÓò. µ«ÕâЩÏÞÖÆ¿ÉÒÔÁîÈ˾ªÑȵØÓü«ÉٵĶîÍâ´úÂëÀ´²¹¾È. SteeleºÍSussmanÔÚһƪ½Ð×ö``½âÊÍÆ÷µÄÒÕÊõ''µÄÖøÃûÂÛÎÄÖÐÃèÊöÁËÈçºÎ×öµ½Õâµã.5

Èç¹ûÄãÀí½âÁËÔ¼º²Âó¿¨ÎýµÄeval, ÄÇÄã¾Í²»½ö½öÊÇÀí½âÁ˳ÌÐòÓïÑÔÀúÊ·ÖеÄÒ»¸ö½×¶Î. ÕâЩ˼ÏëÖÁ½ñÈÔÊÇLispµÄÓïÒåºËÐÄ. ËùÒÔ´ÓijÖÖÒâÒåÉÏ, ѧϰԼº²Âó¿¨ÎýµÄÔ­ÖøÏòÎÒÃÇչʾÁËLisp¾¿¾¹ÊÇʲô. ÓëÆä˵LispÊÇÂó¿¨ÎýµÄÉè¼Æ,²»Èç˵ÊÇËûµÄ·¢ÏÖ. Ëü²»ÊÇÉúÀ´¾ÍÊÇÒ»ÃÅÓÃÓÚÈ˹¤ÖÇÄÜ, ¿ìËÙÔ­ÐÍ¿ª·¢»òͬµÈ²ã´ÎÈÎÎñµÄÓïÑÔ. ËüÊÇÄãÊÔͼ¹«Àí»¯¼ÆËãµÄ½á¹û(Ö®Ò»).

Ëæ×Åʱ¼äµÄÍÆÒÆ, Öм¶ÓïÑÔ, ¼´±»Öмä²ã³ÌÐòԱʹÓõÄÓïÑÔ, ÕýÒ»ÖµØÏòLisp¿¿½ü. Òò´Ëͨ¹ýÀí½âevalÄãÕýÔÚÃ÷°×½«À´µÄÖ÷Á÷¼ÆËãģʽ»áÊÇʲôÑù.

×¢ÊÍ

°ÑÔ¼º²Âó¿¨ÎýµÄ¼ÇºÅ·­ÒëΪ´úÂëµÄ¹ý³ÌÖÐÎÒ¾¡¿ÉÄܵØÉÙ×ö¸Ä¶¯. ÎÒÓйýÈôúÂë¸üÈÝÒ×ÔĶÁµÄÄîÍ·, µ«ÊÇÎÒ»¹ÊÇÏë±£³Öԭ֭ԭζ.

ÔÚÔ¼º²Âó¿¨ÎýµÄÂÛÎÄÖÐ,¼ÙÓÃfÀ´±íʾ, ¶ø²»Êǿձí. ÎÒÓÿձí±íʾ¼ÙÒÔʹÀý×ÓÄÜÔÚCommon LispÖÐÔËÐÐ. (fixme)

ÎÒÂÔ¹ýÁ˹¹Ôìdotted pairs, ÒòΪÄã²»ÐèÒªËüÀ´Àí½âeval. ÎÒҲûÓÐÌáapply, ËäÈ»ÊÇapply(ËüµÄÔçÆÚÐÎʽ, Ö÷Òª×÷ÓÃÊÇÒýÓÃ×Ô±äÁ¿), ±»Ô¼º²Âó¿¨ÎýÔÚ1960Äê³ÆÎªÆÕ±éº¯Êý, evalÖ»ÊDz»¹ýÊDZ»applyµ÷ÓõÄ×Ó³ÌÐòÀ´Íê³ÉËùÓеŤ×÷.

ÎÒ¶¨ÒåÁËlistºÍcxrµÈ×÷Ϊ¼ò¼Ç·¨ÒòΪÂó¿¨Îý¾ÍÊÇÕâô×öµÄ. ʵ¼ÊÉÏ cxrµÈ¿ÉÒÔ±»¶¨ÒåΪÆÕͨµÄº¯Êý. ListÒ²¿ÉÒÔÕâÑù, Èç¹ûÎÒÃÇÐÞ¸Äeval, ÕâºÜÈÝÒ××öµ½, Èú¯Êý¿ÉÒÔ½ÓÊÜÈÎÒâÊýÄ¿µÄ×Ô±äÁ¿.

Âó¿¨ÎýµÄÂÛÎÄÖÐÖ»ÓÐÎå¸öԭʼ²Ù×÷·û. ËûʹÓÃÁËcondºÍquote,µ«¿ÉÄܰÑËüÃÇ×÷ΪËûµÄÔªÓïÑÔµÄÒ»²¿·Ö. ͬÑùËûҲûÓж¨ÒåÂß¼­²Ù×÷·ûandºÍnot, Õâ²»ÊǸöÎÊÌâ, ÒòΪËüÃÇ¿ÉÒÔ±»¶¨Òå³ÉºÏÊʵĺ¯Êý.

ÔÚeval.µÄ¶¨ÒåÖÐÎÒÃǵ÷ÓÃÁËÆäËüº¯ÊýÈçpair.ºÍassoc.,µ«ÈκÎÎÒÃÇÓÃԭʼ²Ù×÷·û¶¨ÒåµÄº¯Êýµ÷Óö¼¿ÉÒÔÓÃeval.À´´úÌæ. ¼´

(assoc. (car e) a)
ÄÜд³É

(eval. '((label assoc.
                (lambda (x y)
                  (cond ((eq (caar y) x) (cadar y))
                        ('t (assoc. x (cdr y))))))
         (car e)
         a)
        (cons (list 'e e) (cons (list 'a a) a)))

Âó¿¨ÎýµÄevalÓÐÒ»¸ö´íÎó. µÚ16ÐÐÊÇ(Ï൱ÓÚ)(evlis. (cdr e) a)¶ø²»ÊÇ(cdr e), ÕâʹµÃ×Ô±äÁ¿ÔÚÒ»¸öÓÐÃûº¯ÊýµÄµ÷ÓÃÖб»ÇóÖµÁ½´Î. ÕâÏÔʾµ±ÂÛÎÄ·¢±íµÄʱºò, evalµÄÕâÖÖÃèÊö»¹Ã»ÓÐÓÃIBM 704»úÆ÷ÓïÑÔʵÏÖ. Ëü»¹Ö¤Ã÷ÁËÈç¹û²»È¥ÔËÐгÌÐò, Òª±£Ö¤²»¹Ü¶à¶ÌµÄ³ÌÐòµÄÕýÈ·ÐÔÊǶàôÀ§ÄÑ.

ÎÒ»¹ÔÚÂó¿¨ÎýµÄÂÛÎÄÖÐÅöµ½Ò»¸öÎÊÌâ. ÔÚ¶¨ÒåÁËevalÖ®ºó, Ëû¼ÌÐø¸ø³öÁËһЩ¸ü¸ß¼¶µÄº¯Êý--½ÓÊÜÆäËüº¯Êý×÷Ϊ×Ô±äÁ¿µÄº¯Êý. Ëû¶¨ÒåÁËmaplist:

(label maplist
       (lambda (x f)
         (cond ((null x) '())
               ('t (cons (f x) (maplist (cdr x) f))))))
È»ºóÓÃËüдÁËÒ»¸ö×ö΢·ÖµÄ¼òµ¥º¯Êýdiff. µ«ÊÇdiff´«¸ømaplistÒ»¸öÓÃx×ö²ÎÊýµÄº¯Êý, ¶ÔËüµÄÒýÓñ»maplistÖеIJÎÊýxËù²¶»ñ.6

ÕâÊǹØÓÚ¶¯Ì¬¿ÉÊÓÓòΣÏÕÐÔµÄÐÛ±çÖ¤¾Ý, ¼´Ê¹ÊÇ×îÔçµÄ¸ü¸ß¼¶º¯ÊýµÄÀý×ÓÒ²ÒòΪËü¶ø³ö´í. ¿ÉÄÜÂó¿¨ÎýÔÚ1960Ä껹ûÓгä·ÖÒâʶµ½¶¯Ì¬¿ÉÊÓÓòµÄº¬Òâ. ¶¯Ì¬¿ÉÊÓÓòÁîÈ˾ªÒìµØÔÚLispʵÏÖÖдæÔÚÁËÏ൱³¤µÄʱ¼ä--Ö±µ½SussmanºÍSteeleÓÚ 1975Ä꿪·¢ÁËScheme. ´Ê·¨¿ÉÊÓÓòûʹevalµÄ¶¨Ò帴ÔÓ¶àÉÙ, ȴʹ±àÒëÆ÷¸üÄÑдÁË.

About this document ...

LispÖ®¸ùÔ´

This document was generated using the LaTeX2HTML translator Version 2K.1beta (1.48)

Copyright © 1993, 1994, 1995, 1996, Nikos Drakos, Computer Based Learning Unit, University of Leeds.
Copyright © 1997, 1998, 1999,
Ross Moore, Mathematics Department, Macquarie University, Sydney.

The command line arguments were:
latex2html -split=0 roots_of_lisp.tex

The translation was initiated by Dai Yuwen on 2003-10-24


Footnotes

... Å·¼¸ÀïµÂ¶Ô¼¸ºÎµÄ¹±Ï×.1
``Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part1.'' Communication of the ACM 3:4, April 1960, pp. 184-195.
...µ±±í´ïʽÒÔÆß¸öԭʼ²Ù×÷·ûÖеÄÎå¸ö¿ªÍ·Ê±,ËüµÄ×Ô±äÁ¿×ÜÊÇÒªÇóÖµµÄ.2
ÒÔÁíÍâÁ½¸ö²Ù×÷·ûquoteºÍcond¿ªÍ·µÄ±í´ïʽÒÔ²»Í¬µÄ·½Ê½ÇóÖµ. µ± quote±í´ïʽÇóֵʱ, ËüµÄ×Ô±äÁ¿²»±»ÇóÖµ,¶øÊÇ×÷ΪÕû¸ö±í´ïʽµÄÖµ·µ»Ø. ÔÚ Ò»¸öÕýÈ·µÄcond±í´ïʽÖÐ, Ö»ÓÐLÐη¾¶ÉϵÄ×Ó±í´ïʽ»á±»ÇóÖµ.
... Êý.3
Âß¼­ÉÏÎÒÃDz»ÐèҪΪÁËÕⶨÒåÒ»¸öеļǺÅ. ÔÚÏÖÓеļǺÅÖÐÓà һ¸ö½Ð×öY×éºÏÆ÷µÄº¯ÊýÉϵĺ¯Êý, ÎÒÃÇ¿ÉÒÔ¶¨ÒåµÝ¹éº¯Êý. ¿ÉÄÜÂó¿¨ÎýÔÚд ÕâÆªÂÛÎĵÄʱºò»¹²»ÖªµÀY×éºÏÆ÷; ÎÞÂÛÈçºÎ, label¿É¶ÁÐÔ¸üÇ¿.
... ûÓÐʵ¼Ê¿ÉÓõÄÊý,4
ÔÚÂó¿¨ÎýµÄ1960 ÄêµÄLispÖÐ, ×öËãÊõÊÇ¿ÉÄܵÄ, ±ÈÈçÓÃÒ»¸öÓÐn¸öÔ­×ӵıí±íʾÊýn.
... µÄÒÕÊõ''µÄÖøÃûÂÛÎÄÖÐÃèÊöÁËÈçºÎ×öµ½Õâµã.5
Guy Lewis Steele, Jr. and Gerald Jay Sussman, ``The Art of the Interpreter, or the Modularity Complex(Parts Zero,One,and Two),'' MIT AL Lab Memo 453, May 1978.
... ¶ÔËüµÄÒýÓñ»maplistÖеIJÎÊýxËù²¶»ñ.6
µ±´úµÄLisp³ÌÐò Ô±ÔÚÕâ¶ù»áÓÃmapcar´úÌæmaplist. Õâ¸öÀý×ӽ⿪ÁËÒ»¸öÃÕÍÅ: maplistΪʲ ô»áÔÚCommon LispÖÐ. ËüÊÇ×îÔçµÄÓ³É亯Êý, mapcarÊǺóÀ´Ôö¼ÓµÄ.

×ªÔØ×Ô£ºhttp://daiyuwen.freeshell.org/gb/rol/roots_of_lisp.html

×îлظ´