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.
- (quote x) ·µ»Øx.ΪÁ˿ɶÁÐÔÎÒÃǰÑ(quote x)¼ò¼Ç Ϊ'x.
> (quote a) a > 'a a > (quote (a b c)) (a b c)
- (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²Ù×÷·ûÀ´Çø·ÖËüÃÇ.
- (eq x y)·µ»ØtÈç¹ûxºÍyµÄÖµÊÇͬһ¸öÔ×Ó»ò¶¼Êǿձí, ·ñÔò·µ»Ø().
> (eq 'a 'a) t > (eq 'a 'b) () > (eq '() '()) t
- (car x)ÆÚÍûxµÄÖµÊÇÒ»¸ö±í²¢ÇÒ·µ»ØxµÄµÚÒ»¸öÔªËØ.
> (car '(a b c)) a
- (cdr x)ÆÚÍûxµÄÖµÊÇÒ»¸ö±í²¢ÇÒ·µ»ØxµÄµÚÒ»¸öÔªËØÖ®ºóµÄËùÓÐÔªËØ.
> (cdr '(a b c)) (b c)
- (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)
- (cond (
...
) ...(
...
)) µÄÇóÖµ¹æÔòÈçÏÂ. p±í´ïʽÒÀ´ÎÇóÖµÖ±µ½ÓÐÒ»¸ö·µ»Øt. Èç¹ûÄÜÕÒµ½ÕâÑùµÄp±í´ïʽ,ÏàÓ¦µÄe±í´ïʽµÄÖµ×÷ΪÕû¸öcond±í´ïʽµÄ·µ»ØÖµ. > (cond ((eq 'a 'b) 'first) ((atom 'a) 'second)) secondµ±±í´ïʽÒÔÆß¸öÔʼ²Ù×÷·ûÖеÄÎå¸ö¿ªÍ·Ê±,ËüµÄ×Ô±äÁ¿×ÜÊÇÒªÇóÖµµÄ.2 ÎÒÃdzÆÕâÑù µÄ²Ù×÷·ûΪº¯Êý.
º¯ÊýµÄ±íʾ
½Ó×ÅÎÒÃǶ¨ÒåÒ»¸ö¼ÇºÅÀ´ÃèÊöº¯Êý.º¯Êý±íʾΪ(lambda (((lambda (
...
) e)
...
)
Ôò³ÆÎªº¯Êýµ÷ÓÃ.ËüµÄÖµ¼ÆËãÈçÏÂ.ÿһ¸ö±í´ïʽ
ÏÈÇóÖµ,È»ºóeÔÙÇóÖµ.ÔÚeµÄÇóÖµ¹ý³ÌÖÐ,ÿ¸ö³öÏÖÔÚeÖеÄ
µÄÖµÊÇÏàÓ¦µÄ
ÔÚ×î½üÒ»´ÎµÄº¯Êýµ÷ÓÃÖеÄÖµ.
> ((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
...
)
²¢ÇÒfµÄÖµÊÇÒ»¸öº¯Êý(lambda (
...
)),ÔòÒÔÉϱí´ïʽµÄÖµ¾ÍÊÇ
((lambda (
...
) e)
...
)
µÄÖµ. »»¾ä»°Ëµ,²ÎÊýÔÚ±í´ïʽÖв»µ«¿ÉÒÔ×÷Ϊ×Ô±äÁ¿Ò²¿ÉÒÔ×÷Ϊ²Ù×÷·ûʹÓÃ:
> ((lambda (f) (f '(b c))) '(lambda (x) (cons 'a x))) (a b c)
ÓÐÁíÍâÒ»¸öº¯Êý¼ÇºÅʹµÃº¯ÊýÄÜÌá¼°Ëü±¾Éí,ÕâÑùÎÒÃǾÍÄÜ·½±ãµØ¶¨ÒåµÝ¹éº¯Êý.3 ¼ÇºÅ
(label f (lambda (
...
) e))
±íʾһ¸öÏó(lambda (
...
) 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 ((defun f (
...
) 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
> (cons 'a (cons 'b (cons 'c '()))) (a b c) > (list 'a 'b 'c) (a b c)
ÏÖÔÚÎÒÃǶ¨ÒåһЩк¯Êý. ÎÒÔÚº¯ÊýÃûºóÃæ¼ÓÁ˵ã,ÒÔÇø±ðº¯ÊýºÍ¶¨ÒåËüÃǵÄÔʼº¯Êý,Ò²±ÜÃâÓëÏÖ´æµÄcommon LispµÄº¯Êý³åÍ».
- (null. x)²âÊÔËüµÄ×Ô±äÁ¿ÊÇ·ñÊǿձí.
(defun null. (x) (eq x '())) > (null. 'a) () > (null. '()) t
- (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)) () - (not. x)·µ»ØtÈç¹ûËüµÄ×Ô±äÁ¿·µ»Ø(),·µ»Ø()Èç¹ûËüµÄ×Ô±äÁ¿·µ»Øt.
(defun not. (x) (cond (x '()) ('t 't))) > (not. (eq 'a 'a)) () > (not. (eq 'a 'b)) t - (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) - (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)) - (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 (
...
) e)
...
)µÄ±í´ïʽÇóÖµ,Ïȵ÷ÓÃevlis.À´ÇóµÃ×Ô±äÁ¿(
...
)¶ÔÓ¦µÄÖµ(
...
),°Ñ(![]()
)...(![]()
)Ìí¼Óµ½»·¾³Àï, È»ºó¶Ô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