Sei sulla pagina 1di 21

Indicaciones para Common LISP Geoffrey J. Gordon <ggordon@cs.cmu.edu> Friday, February 5, !!" #odificado por $runo %aib&e <'aib&e@ma(s(.ma)'ema)i*.uni+*ar&sru'e.

de> ,raducci-n a& espa-o& por .uma ,or)o&ero <numa)or@can)/.ne)> .o)a0 1s)e )u)oria&+in)roducci-n a Common Lisp fue escri)o por e& en+ )orno C#2, a&gunos de &os de)a&&es de c-mo correr &isp pueden diferir de una imp&emen)aci-n a o)ra.

Informaci-n adiciona& +++++++++++++++++++++ 1& me3or &ibro de )e4)o sobre LISP 5ue cono6co es Guy L. S)ee&e Jr.0 7Common LISP0 )'e Language7. 8igi)a& Press. !9:.

La primera edici-n es &a m-s f-ci& de &eer; &a segunda describe un es+ )-ndar m-s recien)e. <Las diferencias en)re &os dos es)-ndar no deber-an afec)ar a &os programadores casua&es.= #e 'an recomendado un &ibro de 8a/e ,oure)s*y, no &o 'e &e-do, no puedo decir nada sobre -&0 8a/e ,oure)s*y0 as5ue

7Common LISP0 > Gen)&e In)roduc)ion )o Symbo&ic Compu)a)ion7. ,'e $en3amin?Cummings Pub&is'ing Company Inc., !!@.

.A,> 81L ,B>82C,AB0 1n par)icu&ar recomiendo e& )e4)o0 Seibe&0 7Prac)ica& Common Lisp7. >ccesib&e en &-nea0

S-mbo&os ++++++++ 2n s-mbo&o es una cadena de carac)eres. %ay res)ricciones sobre &o 5ue se puede inc&uir en un s-mbo&o y cu-& puede ser e& primer carac)er, pero en &a medida 5ue nos &imi)emos a &e)ras, d-gi)os, y guiones, es)a+ remos a sa&/o. <> menos 5ue usemos s-&o d-gi)os y posib&emen)e un gui-n &a inicio, LISP pensar- 5ue escribimos un en)ero en /e6 de un s-mbo&o.= >&gunos e3emp&os de s-mbo&os0 a b

c foo bar baa6+5uu4+garp&y > con)inuaci-n a&gunas cosas 5ue podemos 'acer con s-mbo&os. <Cosas des+ pu-s de un pun)ero C>C es &o 5ue escribimo a& in)-rpre)e LISP, mien)ras 5ue &as o)ras cosas son &o 5ue e& in)-rpre)e LISP imprime. 1& signo C;C es e& carac)er de LISP para comen)arios0 )odo &o 5ue es)- desde un C;C 'as)a e& fina& de una &-nea es ignorado.= > 5 > 5 > D > 5 > <se)5 a 5= a <&e) <<a D== a= a ; ; a&macena un n-mero como e& /a&or de un s-mbo&o ; )omar e& /a&or de un s-mbo&o ; &igar )empora&men)e e& /a&or de un s-mbo&o a D

; e& /a&or regresa a 5 una /e6 5ue 'a fina&i6ado &a e/a&uaci-n de &e) <E a D= ; usar e& /a&or de un s-mbo&o como un argumen)o ; para una funci-n > b ; in)en)ar )omar e& /a&or de un s-mbo&o 5ue no ; )iene /a&or 1rror0 Se in)en)- )omar e& /a&or de s-mbo&o $ no &igado %ay dos s-mbo&os especia&es, ) y ni&. 1& /a&or de ) se define como sien+ do siempre ), y e& /a&or de ni& se define como siendo siempre ni&. LISP usa ) y ni& para in)erpre)ar /erdadero <)rue= y fa&so. 2n e3emp&o de c-+ mo se usan es)os s-mbo&os &o encon)ramos en e& enunciado if, 5ue &uego describiremos me3or0 > <if ) 5 D= 5 > <if ni& 5 D= D > <if : 5 D= 5 1& -&)imo e3emp&o es raro pero correc)o0 ni& significa fa&so y cua&5uier o)ra cosa significa /erdad. <> menos 5ue )engamos una ra6-n para 'acer&o de o)ra manera, usamos ) para significar /erdad, s-&o por ra6ones de c&aridad.= Los s-mbo&os como ) y ni& se &&aman s-mbo&os au)o+e/a&uan)es, por5ue su e/a&uaci-n da como resu&)ado a s- mismos. %ay una c&ase en)era de s-mbo+ &os au)oe/a&uan)es &&amados pa&abras c&a/es <*eyFords=; cua&5uier s-mbo+ &o cuyo nombre comience con un signo de dos pun)os es una pa&abra c&a/e. <>ba3o /eremos a&gunas pa&abras c&a/e.= >&gunos e3emp&os de pa&abras c&a/e0 > 0es)a+es+una+pa&abra+c&a/e 01S,>+1S+2.>+P>L>$B>+CL>G1 > 0asi+es+es)a 0>SI+1S+1S,> > 0yo+)ambien 0HA+,>#$I1.

.-meros +++++++ 2n en)ero es una cadena de d-gi)os opciona&men)e precedidos por E o +. 2n n-mero rea& se /e como un en)ero, pero )iene un pun)o decima& y opciona&men)e puede ser escri)o en no)aci-n cien)-fica. 2n raciona& se /e como dos en)eros con un ? en)re e&&os. LISP sopor)a n-meros comp&e3os, &os cua&es son escri)os con &a forma Ic<r i= <donde r es &a par)e rea& e i es &a par)e imaginaria=. 2n n-mero es cua&5uiera de &os de arriba. %e a5u- a&gunos n-meros0 5 J +": ED ". : 5 .J((e+ 5 Ic< .J((e+ 5 @.J5= Las funciones ari)m-)icas es)-ndar es)-n )odas disponib&es0 E, +, K, ?, f&oor, cei&ing, mod, sin, cos, )an, s5r), e4p, e4p), e)c. ,odas e&&as acep)an cua&5uier )ipo de n-mero como argumen)o. E, +, K, y ? regresan un n-mero de acuerdo a& )ipo de Kcon)agion0 un en)ero m-s un raciona& es un raciona&, un raciona& m-s un rea& es un rea&, y un rea& m-s un com+ p&e3o es un comp&e3o. %e a5u- a&gunos e3emp&os0 > <E " "?:= 5?: > <e4p = (.J 9(9 J > <e4p "= (@.@955"J > <e4p) " :.(= @@.!@: 9 > <E 5 D J <K 9 ! ;)ype Kcon)agion ;e ;eKeKe ;e4ponen)e con una base diferen)e a e @== ;&as funciones E+K? acep)an m-&)ip&es argumen)os

.o 'ay &-mi)e para e& /a&or abso&u)o de un en)ero e4cep)o e& )ama-o de &a memoria de& compu)ador. %ay 5ue )ener en cuen)a 5ue &os c-mpu)os con grandes n-meros en)eros puede ser &en)a. <So can compu)a)ions Fi)' ra)iona&s, especia&&y compared )o )'e corresponding compu)a)ions Fi)' sma&& in)egers or f&oa)s.=

Conses ++++++ 2n cons es un regis)ro de dos campos. Los campos son &&amados CcarC y CcdrC, por ra6ones 'is)-ricas. <1n &a primera m-5uina donde LISP fue imp&emen)ado, 'ab-an dos ins)rucciones C>B y C8B para Ccon)en)s of address regis)erC y Ccon)en)s of decremen) regis)erC. Los conses fueron imp&emen)ados usando es)os dos regis)ros.= Los conses son f-ci& de usar0 > <cons : 5= <: . 5= > <cons <cons : 5= D= ;Loca&i6ar un cons. Poner e& car en : y e& cdr en 5.

<<: . 5= . D= > <car <cons : 5== : > <cdr <cons : 5== 5

Lis)as ++++++ Se pueden cons)ruir muc'as es)ruc)uras adem-s de &os conses. Lui6-s &a m-s simp&e es una &is)a en&a6ada0 e& car de cada cons apun)a a uno de &os e&emen)os de &a &is)a, y e& cdr apun)a a o)ro cons o a ni&. Se puede crear una &is)a en&a6ada con &a funci-n &is)0 > <&is) : 5 D= <: 5 D= .o)a 5ue LISP imprime &is)as en&a6adas de una manera especia&0 omi)e a&+ gunos de &os per-odos y de &os par-n)esis. La reg&a es0 si e& cdr de un cons es ni&, LISP KdoesnM) bo)'erK en imprimir e& per-odo o e& ni&; si e& cdr de& cons > es cons $, en)onces LISP KdoesnM) bo)'erK en imprimir e& per-odo para e& cons > o e& par-n)esis para e& cons $. >s-0 > <cons : ni&= <:= > <cons : <cons 5 D== <: 5 . D= > <cons : <cons 5 <cons D ni&=== <: 5 D= 1& -&)imo e3emp&o es e4ac)amen)e e5ui/a&en)e a &a &&amada <&is) : 5 D=. .o)a 5ue ni& a'ora significa &a &is)a sin e&emen)os0 e& cdr de <a b=, una &is)a con dos ( e&emen)os, es <b=, una &is)a con e&emen)o; y e& cdr de <b=, una &is)a con e&emen)o, es ni&, 5ue por&o )an)o debe ser una &is)a sin e&emen)os. 1& car y e& cdr de ni& se definen para 5ue sean ni&. Si se a&macena &a &is)a en una /ariab&e, una pi&a0 > <se)5 a ni&= .IL > <pus' : a= <:= > <pus' 5 a= <5 := > <pop a= 5 > a <:= > <pop a= : > <pop a= .IL > a .IL se &a puede 'acer ac)uar como

Funciones +++++++++ >rriba /imos e& e3emp&o de una funci-n. %e a5u- a&gunos m-s0 > <E " : 5 D= ;es)a funci-n )oma cua&5uier .o. de 9 ; argumen)os > <E <E " := <E <E : 5= D== ;no es una no)aci-n prefi3a funN (( > <defun foo <4 y= <E 4 y 5== ;definiendo una funci-n FAA > <foo 5 @= ;&&amando a una funci-n @ > <defun fac) <4= ;una funci-n recursi/a <if <> 4 @= <K 4 <fac) <+ 4 === = = F>C, > <fac) 5= (@ > <defun a <4= <if <O 4 @= ) <b <+ 4==== ;funciones mu)ua#cCar)'y.+.men)e > ; recursi/as > <defun b <4= <if <> 4 @= <a <+ 4 == <a <E 4 ==== $ > <a 5= , > <defun bar <4= ;una funci-n con m-&)ip&esenunciados <se)5 4 <K 4 "== ;en su cuerpo ++ regresar- e& /a&or <se)5 4 <? 4 (== ;regresado por su enunciado fina& <E 4 := = $>B > <bar D= " Cuando definimos foo, &e dimos dos argumen)os, 4 e y. >'ora, cuando &&a+#cCar)'y.+. mamos a foo, es)amos ob&igados a dar e4ac)amen)e dos argumen)os0 e& pri+ mero ser- e& /a&or de 4 para &a duraci-n de &a&&amada a foo, y e& segun+ do ser- e& /a&or de y para &a duraci-n de &a &&amada. 1n LISP, &a mayo+ r-a de &as /ariab&es es)-an &e4icamen)e KscopedK; es decir, si foo &&ama a bar y bar in)en)a referenciar a 4, bar no ob)endr- e& /a&or de foo pa+ ra 4. 1& proceso de asignar a un s-mbo&o un /a&or para &a duraci-n de a&g-n -mbi)o &-4ico se &e &&ama &igadura. Se pueden especificar argumen)os opciona&es a &as funciones. Cua&5uier argumen)o despu-s de& s-mbo&o Pop)iona& es opciona&0 > <defun bar <4 Pop)iona& y= <if y 4 @== $>B > <defun baa6 <Pop)iona& <4 "= <6 @== <E 4 6== $>>Q > <bar 5=

@ > <bar 5 )= 5 > <baa6 5= 5 > <baa6 5 D= > <baa6= " 1s &ega& &&amar a &a funci-n bar con uno o dos argumen)os. Si se &&ama con un argumen)o, 4 ser- &igado a& /a&or de ese argumen)o e y ser- &iga+ da a ni&; si es &&amado con dos argumen)os, 4 e y ser-n &igadas a &os /a&ores de& primer y segundo argumen)o, respec)i/amen)e. La funci-n baa6 )iene dos argumen)os opciona&es. 1specifica un /a&or por defec)o para cada argumen)o0 si &a ru)ina 5ue 'ace &a &&amada especifica s-&o un argumen)o, 6 ser- &igada a @ en /e6 de a ni&, y si &a funci-n 5ue &&ama no especifica argumen)os, 4 ser- &igado a " y 6 a @. Se puede 'acer 5ue &a funci-n acep)e cua&5uier n-mero de argumen)os )er+ minando su &is)a de argumen)os con un par-me)ro Pres). LISP co&eccionar)odos &os arguemen)os Kno) o)'erFise accoun)ed forK den)ro de una &is)a y &igar- e& par-me)ro Pres) a esa &is)a. >s-0 > <defun foo <4 Pres) y= y= FAA > <foo "= .IL > <foo : 5 D= <5 D= Fina&men)e, se puede dar a &as funciones o)ro )ipo de argumen)o opciona& &&amado un argumen)o de pa&abra c&a/e. La ru)ina 5ue &&ama puede dar es+ )os argumen)os en cua&5uier orden, por5ue es)-n e)i5ue)ados con pa&abras c&a/e. > <defun foo <P*ey 4 y= <cons 4 y== FAA > <foo 04 5 0y "= <5 . "= > <foo 0y " 04 5= <5 . "= > <foo 0y "= <.IL . "= > <foo= <.IL= 2n par-me)ro P*ey )ambi-n puede )ener un /a&or por defec)o0 > <defun foo <P*ey <4 5== 4= FAA > <foo 04 J= J > <foo= 5

Impresi-n +++++++++ >&gunas funciones pueden producir sa&idas. La m-s simp&e es prin), 5ue imprime su arumen)o y &uego &o regresa. > <prin) "= " " 1& primer " de arriba fue e& /a&or impreso, e& segundo e& regresado. Si se desea una sa&ida m-s comp&icada, se necesi)ar- usar un forma)o. %e a5u- un e3emp&o0 > <forma) ) C>n a)om0 RSRSand a &is)0 RSRSand an in)eger0 R8RSC ni& <&is) 5= D= >n a)om0 .IL and a &is)0 <5= and an in)eger0 D 1& primer argumen)o a forma)ear es ), ni&, o un f&u3o <s)ream=. , espe+ cifica sa&ida a& )ermina&. .i& no significa imprimir nada sino m-s bien regresar una cadena 5ue con)enga &a sa&ida. Los f&u3os son &ugares gene+ ra&es Kfor ou)pu) )o goK0 pueden especificar un arc'i/o, o e& )ermina&, u o)ro programa. 1n es)e manua& no describiremos &os f&u3os con mayores de)a&&es. 1& segundo argumen)o es una p&an)i&&a forma)eadora, 5ue opciona&men)e con)iene direc)i/as forma)eadoras. 5ue es una cadena

Los argumen)os res)as)an)es pueden ser referidos por &as direc)i/as for+ ma)eadoras. LISP reemp&a6ar-&as direc)i/as con a&gunos carac)eres apro+ piados basados en &os argumen)os a &os 5ue e&&os refieren y &uego impri+ men &a cadena resu&)an)e. 1& forma)o siempre regresa ni& a menos 5ue su primer argumen)o sea ni&, en cuyo caso no imprime nada y regresa una cadena. %ay )res direc)i/as diferen)es en e& e3emp&o de arriba0 RS, R8, y RS. La primera acep)a cua&5ier ob3e)o LISP y es reemp&a6ada por una represen)a+ ci-n impresa de ese ob3e)o <&a misma represen)aci-n 5ue es producida por prin)=. La segunda s-&o acep)a en)eros. La )ercera no refiere a un argu+ men)o; siempre es reemp&a6ada por e& re)orno de carro. A)ra direc)i/a -)i& es RR, 5ue es reemp&a6ada por un R. Be/isa e& manua& para dar forma)o. de LISP para <muc'as, muc'as= direc)i/as adiciona&es

Formas y e& buc&e en e& ni/e& superior ++++++++++++++++++++++++++++++++++++++ Las cosas 5ue escribes a& in)-rpre)e LISP se &&aman formas; e& in)-rpre+ )e LISP &ee repe)idas /eces una forma, &a e/a&ua, e imprime e& resu&)a+ do. 1s)e procedimien)o es &&amado e& buc&e &eer+e/a&uar+imprimir <B1>8,

1G>L, PBI., LAAP0 B1PL=. >&gunas formas producir-n errores. 8espu-s de un error, LISP &o pondren e& depurador para 5ue in)en)es dar con &a causa de& error. Los depu+ radores LISP son diferen)es; pero &a mayor-a responder- a &a orden C'e&pC o C0'e&pC dando a&guna forma de ayuda. 1n genera&, una forma es un -)omo <por e3emp&o, un s-mbo&o, un en)ero, o una cadena= o una &is)a. Si &a forma es un -)omo, LISP &a e/a&ua de in+ media)o. Los s-mbo&os e/a&uan su /a&or; &os en)eros y &as cadenas se e/a&-an a s- mismos. Si &a forma es una &is)a, LISP in)en)a e/a&uar su primer e&emen)o como e& nombre de una funci-n; e/a&ua &os e&emen)os res+ )anes recursi/amen)e, y &uego &&ama &a funci-n con &os /a&ores de& res)o de e&emen)os como argumemn)os. Por e3emp&o, si LISP /e &a forma <E " :=, )ra)a E como e& nombre de una funci-n. Luego e/a&-a " para ob)ener " y : para ob)ener :; fina&men)e &&ama a E con " y : como argumen)os. La funci-n E regresa J, 5ue LISP imprime. 1& buc&e de& ni/e& )ope nos permi)e 'acer o)ras )areas con/enien)es; una es &a par)icu&aridad de 'ab&ar acerca de &os resu&)ados de formas escri+ )as pre/iamen)e. LISP siempre sa&/a sus )res resu&)ados m-s recien)es; &os a&macena como /a&ores de &os s-mbo&os K, KK, y KKK. Por e3emp&o0 > " > : > 5 > " > : > 5 > : > : " : 5 KKK KKK KKK KK K

Formas especia&es +++++++++++++++++ %ay /arias formas especia&es 5ue parecen &&amadas a funciones pero no &o son. 1n)re e&&as se inc&uyen &os cons)ruc)os de con)ro& como &os enunciados if y &os buc&es do; asignaciones como se)5, se)f, pus', y pop; definiciones como defun y defs)ruc); y cons)ruc)os de &igaduras como &e). <.o )odas es)as formas especia&es 'an sido comen)adas )oda+ /-a. Ger aba3o.= 2na forma especia& 5ue es muy -)i& es &a forma 5uo)e0 5uo)e e/i)a 5ue su argume)o sea e/a&uado. Por e3emp&o0 > <se)5 a "= "

> a " > <5uo)e a= > > Ma >

;Ma es una abre/ia)ura de <5uo)e a=

A)ra forma especia& es &a forma func)ion0 func)ion 'ace 5ue su argumen+ )o sea in)erpre)ado como una funci-n en /e6 de ser e/a&uado. Por e3em+ p&o0 > <se)5 E "= " > E " > ME E > <func)ion E= I<Func)ion E @ I4+fbef!de> > IME ;IME es una abre/ia)ura para <func)ion E= I<Func)ion E @ I4+fbef!de> La forma especia& func)ion es -)i& cuando se desea pasar una funci-n como un argumen)o a o)ra funci-n. Se pueden /er m-s aba3o a&gunos e3em+ p&os de funciones 5ue )oman funciones como argumen)os.

Ligaduras <binding= +++++++++++++++++++ 2na &igadura es una asignaci-n per)enecian)e por &-4ico a un -mbi)o. Le ocurre a &as /ariab&es en &a &is)a de par-me)ros de una funci-n cada /e6 5ue es funci-n es &&amada0 &os par-me)ros forma&es son &igados a &os pa+ r-me)ros ac)ua&es mien)ras dure &a e3ecuci-n de &a &&amada a &a funci-n. Se pueden &igar /ariab&es en cua&5uier &ugar de& programa con &a forma especia& &e), 5ue )iene e& siguien)e aspec)o0 <&e) <</ar /a& = </ar( /a&(= ... = body = Gamos a &igar /ar a /a& , /ar( a /a&(, e)c; &uego se e3ecu)ar-n &os enunciados en su cuerpo. 1& cuerpo de un &e) sigue e4ac)amen)e &as mis+ mas reg&as 5ue un cuerpo de func)ion. >&gunos e3emp&os0 > <&e) <<a "== <E a == : > <&e) <<a (= <b "= <c @== <se)5 c <E a b== c = 5 > <se)5 c :=

: > <&e) <<c 5== c= 5 > c : 1n /e6 de <&e) <<a ni&= <b ni&== ...=, se puede escribir <&e) <a b= ...=. Los /a& , /a&(, e)c. den)ro de un &e) no pueden 'acer referencia a &as /ariab&es /ar , /ar(, e)c. 5ue e& &e) es)- &igando. Por e3emp&o, > <&e) <<4 = <y <E 4 === y = 1rror0 >))emp) )o )a*e )'e /a&ue of )'e unbound symbo& T Si e& s-mbo&o 4 ya )iene un /a&or g&oba&, ocurrir-n sucesos e4)ra-os0 > <se)5 4 J= J > <&e) <<4 = <y <E 4 y = 9

===

La forma especia& &e)K es como &e) e4cep)o 5ue permi)e /a&ores 5ue refe+ rencien a /ariab&es definidas an)es en e& &e)K. Por e3emp&o, > <se)5 4 J= J > <&e)K <<4 = <y <E 4 y = ( La forma <&e)K <<4 a= <y b== ... = es e5ui/a&en)e a <&e) <<4 a== <&e) <<y b== ... = =

===

Per)enecia din-mica a -mbi)os +++++++++++++++++++++++++++++ Las formas &e) y &e)K crean un -mbi)o &-4ico, 5ue es &o 5ue se espera si se es)- acos)umbrado a programar en C o Pasca&. La per)encia din-mica a

-mbi)os es &o 5ue se ob)iene en $>SIC0 si se asigna un /a&or a una /a+ riab&e 5ue per)enec din-micamen)e a un -mbi)o cua&5uier menci-n de esa /ariab&e regresar- ese /a&or 'as)a 5ue se asigne o)ro /a&or a &a misma /ariab&e. 1n LISP, &as /ariab&es de un -mbi)o creado din-micamen)e se &&aman /a+ riab&es especia&es. Se puede dec&arar una /ariab&e especia& con &a forma especia& def/ar. > con)inuaci-n a&gunos e3emp&os de /ariab&es 5ue per)e+ necen din-mica y &-4icamen)e a -mbi)os. 1n es)e e3emp&o, &a funci-n c'ec*+regu&ar 'ace referencia a una /ariab&e regu&ar <es decir, con per)enencia &-4ica a un -mbi)o=. Como c'ec*+regu+ &ar es)- &e4icamen)e fuera de& &e) 5ue &a &iga como regu&ar, c'ec*+regu+ &ar regresa e& /a&or g&oba& de &as /ariab&es. > <se)5 regu&ar 5= 5 > <defun c'ec*+regu&ar <= regu&ar= C%1CU+B1G2L>B > <c'ec*+regu&ar= 5 > <&e) <<regu&ar D== <c'ec*+regu&ar== 5 1n es)e e3emp&o, &a funci-n c'ec*+specia& referencia a una /ariab&e es+ pecia& <es decir, con per)enecia din-mica a un -mbi)o=. Como &a &&amada a c'ec*+specia& es)- )empora&men)e den)ro de& &e) 5ue &iga como especia&, c'ec*+specia& regresa e& /a&or &oca& de &a /ariab&e. > <def/ar Kspecia&K 5= KSP1CI>LK > <defun c'ec*+specia& <= Kspecia&K= C%1CU+SP1CI>L > <c'ec*+specia&= 5 > <&e) <<Kspecia&K D== <c'ec*+specia&== D Por con/enci-n, e& nombre de una /ariab&e especia& comien6a y )ermina con un K. Las /ariab&es especia&es se usan especia&men)e como /ariab&es g&oba&es, debido a 5ue genera&men)e &os programadores esperan per)enen+ cia &-4ica a un -mbi)o para /ariab&es &oca&es y per)enencia din-mica pa+ ra /ariab&es g&oba&es. Para m-s informaci-n sobre &as diferencias en)re K&e4ica& and dynamic scopingK, /er 7Common LISP0 )'e Language7.

>rrays ++++++ La funci-n ma*e+array 'ace un array. La funci-n aref accede a sus e&e+ men)os. ,odos &os e&emen)os de un array se es)ab&ecen inicia&men)e como ni&. Por e3emp&o0 > <ma*e+array M<" "== I(a<<.IL .IL .IL= <.IL .IL .IL= <.IL .IL .IL== > <aref K =

.IL > <ma*e+array := I<.IL .IL .IL .IL=

; 8 arrays no necesi)an padres e4)ra

Los -ndices de un array siempre comien6an en @. Be/isa m-s aba3o para 5ue /eas c-mo se pueden es)ab&ecer &os e&emen)os de un array.

Cadenas +++++++ 2na cadena es una secuencia de carac)eres en)re comi&&as dob&es. LISP represen)a una cadena como un array de carac)eres de )ama-o /ariab&e. Se puede escribir una cadena 5ue con)enga una comi&&a dob&e precedi-ndo &a comi&&a con un Kbac*s&as'K; un Kdoub&e bac*s&as'K se usa para designar un carac)er Kbac*s&as'K. Por e3emp&o0 CabcdC 'as : c'arac)ers CVCC 'as c'arac)er CVVC 'as c'arac)er %e a5u- a&gunas funciones para )ra)ar con cadenas0 > <conca)ena)e Ms)ring CabcdC CefgC= CabcdefgC > <c'ar CabcC = IVb ;LISP Fri)es c'arac)ers preceded by IV > <aref CabcC = IVb ;remember, s)rings are rea&&y arrays ,'e conca)ena)e func)ion can ac)ua&&y For* Fi)' any )ype of se5uence0 > <conca)ena)e Ms)ring M<IVa IVb= M<IVc== CabcC > <conca)ena)e M&is) CabcC CdeC= <IVa IVb IVc IVd IVe= > <conca)ena)e M/ec)or MI<" " "= MI<" " "== I<" " " " " "=

1s)ruc)uras +++++++++++ Las es)ruc)uras de LISP son an-&ogas a &as es)ruc)uras de C o records de Pasca&. %e a5u- un e3emp&o0 > <defs)ruc) foo bar baa6 5uu4 = FAA 1s)e e3emp&o define un )ipo de da)o &&amado foo 5ue es una es)ruc)ura 5ue con)iene )res campos. ,ambi-n define cua)ro funciones 5ue operan so+ bre es)e )ipo de da)os0 ma*e+foo, foo+bar, foo+baa6, y foo+5uu4. 1& pri+

mero 'ace un ob3e)o nue/o de& )ipo foo; Los o)ros acceden a &os cam+ pos de un ob3e)o de )ipo foo. > con)inuaci-n se presen)a c-mo usar es)as funciones0 > <ma*e+foo= Is<FAA 0$>B .IL 0$>>Q .IL 0L22T .IL= > <ma*e+foo 0baa6 "= Is<FAA 0$>B .IL 0$>>Q " 0L22T .IL= > <foo+bar K= .IL > <foo+baa6 KK= " La funci-n ma*e+foo puede )omar un argumen)o de pa&abra c&a/e para cada uno de &os campos aue una es)ruc)ura de )ipo foo puede )ener. 1& campo accede a funciones 5ue )oman cada una un argumen)o, una es)ruc)ura de )ipo foo, y regresan e& campo apropiado. Se puede re/isar m-s aba3o c-mo es)ab&ecer &os campos de una es)ruc)ura.

Se)f ++++ Cier)as formas en LISP definen na)ura&men)e una &oca&i6aci-n de memoria. Por e3emp&o, si e& /a&or de 4 es una es)ruc)ura de )ipo foo, en)onces <foo+bar 4= define e& campo bar de& /a&or de 4. A, si e& /a&ores de y es un array uni+dimensiona&, <aref y (= define e& "er e&emen)o de y. La frma especia& se)f usa su er argumen)o para definir un &ugar en me+ moria, e/a&ua su segundo argumen)o, y a&macena e& /a&or resu&)an)e en &a &oca&idad de memoria resu&)an)e. Por e3emp&o, > <se)5 a <ma*e+array "== I<.IL .IL .IL= > <aref a = .IL > <se)f <aref a = "= " > a I<.IL " .IL= > <aref a = " > <defs)ruc) foo bar= FAA > <se)5 a <ma*e+foo== Is<FAA 0$>B .IL= > <foo+bar a= .IL > <se)f <foo+bar a= "= " > a Is<FAA 0$>B "= > <foo+bar a= " Se)f es &a -nica manera de es)ab&ecer &os campos de una es)ruc)ura o &os e&emen)os de un array.

%e a5u- a&gunos e3emp&os m-s de se)f y funciones re&acionadas. > <se)f a <ma*e+array I<.IL= > <pus' 5 <aref a == <5= > <pop <aref a == 5 > <se)f <aref a = 5= 5 > <incf <aref a == D > <aref a = D == ;se)f on a /ariab&e is e5ui/a&en) )o se)5 ;pus' can ac) &i*e se)f ;so can pop

;incf reads from a p&ace, incremen)s, ;and Fri)es bac*

$oo&eanos and Condiciona&es +++++++++++++++++++++++++++ LISP usa e& s-mbo&o au)o+e/a&uan)e ni& para significar fa&so. Cua&5uier o)ro 5ue no sea ni& significa /erdad. > menos 5ue no )engamos una ra6-n, usua&men)e usamos e& s-mbo&o au)o e/a&uan)e ) para man)ener &a /erdad. LISP pro/ee un con3un)o es)-ndar de funciones &-gicas, por e3emp&o and, or, y no). Las conec)i/as and y or son Ks'or)+circui)ingK0 y no e/a&ua+ r-n ning-n argumen)o a &a derec'a de& primero 5ue e/a&-a a ni&, mien)ras 5ue no se e/a&ue ning-n argumen)o a &a derec'a de& primero 5ue e/a&-a a ). LISP )ambi-n pro/ee /arias formas especia&es para e3ecuci-n condiciona&. La m-s sinp&e es if. 1& primer argumen)o de if de)ermina si e& segundo o )ercer argumen)o ser- e3ecu)ado0 > <if ) 5 D= > <if : 5 D= 5 Si se necesi)a es)ab&ecer m-s de un argumen)o en &a c&-usu&a )'en o e&se de un enunciado if, se puede usar &a forma especia& progn. Progn e3ecu)a cada enunciado en su cuerpo, &uego regresa e& /a&or de& fina&. > J > @ > 5 > <se)5 a J= <se)5 b @= <se)5 c 5= <if <> a 5= <progn <se)5 a <E b J== <se)5 b <E c 9=== <se)5 b := =

"

2n enunciado if 5ue care6ca de una c&-usu&a )'en o e&se puede escribirse usando &a forma especia& F'en o un&ess0

> <F'en ) "= " > <F'en ni& "= .IL > <un&ess ) "= .IL > <un&ess ni& "= " W'en y un&ess, a diferencia de if, permi)en cua&5uier n-mero de enuncia+ dos en sus cuerpos. Por e3emp&o, <F'en 4 a b c= e5ui/a&e a <if 4 <progn a b c==.= > <F'en ) <se)5 a 5= <E a D= = Los condiciona&es m-s comp&icados pueden ser definidos usando &a forma especia& cond, 5ue e5ui/a&e a una cons)rucci-n if ... e&se if ... fi. 2n cond consis)e en e& s-mbo&o cond seguido por /arias c&-usu&as cond, cada una de &as cua&es es una &is)a. 1& primer e&emen)o de una c&-usu&a cond es &a condici-n; e& res)o de e&emen)os <si 'ay a&guno= son &a ac+ ci-n. La forma cond encuan)ra &a primera c&-usu&a cuya condici-n e/e&-a a /er+ dad <es decir, no e/a&-a a ni&=; &uego e3ecu)a &a acci-n correspondien)e y regresa e& /aor resu&)an)e. .inguna de &as res)an)es condiciones son e/a&uadas; ni son ninguna acci-n e4cep)o &a correspondien)e a &a condi+ ci-n se&eccionada. Por e3emp&o0 > <se)5 a "= " > <cond <<e/enp a= a= <<> a J= <? a (== <<< a 5= <+ a == <) J= = (

;si a ;pero ;pero ;sino

es e/en regresar a si a es mayor 5ue J regresar a?( si a es menor 5ue 5 regresar a+ regresar J

Si no 'ay acci-n en &a c&-usu&a cond se&eccionada, dio &a e/a&uaci-n de &a condici-n0 > <cond <<E " :=== J

cond

regresa &o 5ue

%e a5u- una funci-n recursi/a Kc&e/er &i))&e recursi/e func)ionK 5ue usa cond. Se podr-a es)ar in)eresado en in)en)ar probar 5ue )ermina para )o+ dos &os en)eros 4 a& menos . <Si )ienes -4i)o, por fa/or pub&ica e& re+ su&)ado.= > <defun 'o)po <4 s)eps= <cond <<O 4 = s)eps= <<oddp 4= <'o)po <E ;'o)po significa %a&f Ar ,rip&e P&us Ane <K 4 "== <E s)eps===

> > <'o)po J @= D

<) <'o)po <? 4 (= <E = =

s)eps===

1& enunciado case de LISP es como e& enunciado sFi)c' de C0 > <se)5 4 Mb= $ > <case 4 <a 5= <<d e= J= <<b f= "= <o)'erFise != = " La c&-usu&a o)'erFise a& fina& significa 5ue si 4 no es a, b, f, e& enunciado case regresar- !. d, e, o

I)eraci-n +++++++++ 1& cons)ruc)o de i)eraci-n m-s simp&e de LISP es &oop0 e3ecu)a su cuerpo repe)idamen)e 'as)a 5ue regresa una forma especia&. Por e3emp&o > <se)5 a := : > <&oop <se)5 a <E a == <F'en <> a J= <re)urn a== = 9 > <&oop <se)5 a <+ a == <F'en << a "= <re)urn== = .IL 1& seguien)e cons)ruc)o, a-n m-s simp&e, es do&is)0 do&is) &iga una /a+ riab&e a &os e&emen)os de una &is)a en orden y de)enerse cuando &a &is)a &&egue a& fina&. > <do&is) <4 M<a b c== <prin) 4== > $ C .IL 8o&is) siempre regresa ni&. .o)e 5ue e& /a&or de 4 en ne& e3emp&o an)e+ rior nunca fue ni&0 e& .IL deba3o de& C fue e& /a&or regresado por do&is), imprimido por e& buc&e &eer+e/a&uar+imprimir. La m-s comp&icada primi)i/a de i)eraci-n se &&ama do. )iene e& siguien)e aspec)o0 > <do <<4 <E 4 == 2n enunciado do

<y <K y (=== <<> 4 5= y= <prin) y= <prin) MFor*ing=

WABUI.G ( WABUI.G : WABUI.G 9 WABUI.G D WABUI.G "( La primera par)e de un do especifica 5u- /ariab&es &igar, cu-&es son sus /a&ores inicia&es, y c-mo ac)ua&i6ar&os. La segunda par)e especifica una condici-n de )erminaci-n y un /a&or de regreso. La -&)ima par)e es e& cuerpo. 2na forma do &iga sus /ariab&es a sus /a&ores inicia&es como un &e), &uego c'e5uea &-a condici-n de )erminaci-n. 1n &a medida 5ue &a condici-n sea fa&sa, e3ecu)a e& cuerpo repe)idas /eces; cuando &a condi+ ci-n &&ega a ser /erdad, regresa e& /a&or de &a forma re)urn+/a&ue. La forma doK es para do &o 5ue &e)K es para &e).

Sa&idas no &oca&es ++++++++++++++++++ 1& regreso de &a forma especia& mencionado en &a secci-n sobre i)eraci-n es un e3emp&o de regreso no &oca&. A)ro e3emp&o es &a forma re)urn+from, 5ue regresa un /a&or desde &a funci-n Ksurrounding0 > <defun foo <4= <re)urn+from foo "= 4 = FAA > <foo J= " Bea&men)e, &a forma re)urn+from puede regresar de cua&5uier b&oc5ue++es 3us)o esas funciones 5ue son &os -nicos b&o5ues 5ue son nombrados por defec)o. Sepueden crear b&o5ues con nombres con &a forma especia& form0 > <b&oc* foo <re)urn+from foo J= " = J La forma especia& re)urn puede regresar de cua&5uier b&o5ue &&amado ni&. Por defec)o, &os buc&es son e)i5ue)ados como ni&, pero se pueden 'acer nues)ros propios b&o5ues e5)i5ue)ados ni&0 > <b&oc* ni&

= J

<re)urn J= "

A)ra forma 5ue 'ace una sa&ida no &oca& es &a forma error0 > <error C,'is is an errorC= 1rror0 ,'is is an error La forma error ap&ica forma)o a sus argumen)os, &uego &os co&oca en e& depurador.

Funca&&, >pp&y, y #apcar ++++++++++++++++++++++++ >n)eriormen)e prome)- dar a&gunas fuciones 5ue )omaran funciones como argumen)os. %e&as a con)inuaci-n0 > <funca&& IME " := J > <app&y IME " : M<" :== : > <mapcar IMno) M<) ni& ) ni& ) ni&== <.IL , .IL , .IL ,= Funca&& &&ama su primer argumen)o en sus reas)an)es argumen)os. app&y es como funca&&, e4cep)o 5ue su argumen)o fina& deber-a ser una &is)a; &os e&emen)os de esa &is)a son )ra)ados como si fueran argumen)os adiciona&es a una funca&&. 1& primer argumen)o para mapcar debe ser una funci-n de un argumen)o; mapcar ap&ica es)a funci-n a cada e&emen)o de una &is)a y co&ecciona &os resu&)ados en o)ra &is)a. funca&& y app&y son especia&men)e -)i&es cuando su primer argumen)o es una /ariab&e. Por e3emp&o, un mo)or de b-s5ueda podr-a )omar una funci-n 'eur-s)ica como un par-me)ro y usar funca&& o app&y para &&amar esa fun+ ci-n en una descripci-n de es)ado. Las funciones de ordenamien)o descri+ )as &uego usan funca&& para &&amar sus funciones de comparaci-n. #apcar, 3un)o a sus funciones sin nombre </er aba3o=, muc'os buc&es. pueden reemp&a6ar

Lambda ++++++ Si se desea crear una funci-n )empora& y no se 5uiere bo)'er d-ndo&e un nombre, &o 5ue se necesi)a es &ambda. > IM<&ambda <4= <E 4 "== <L>#$8> <T= <E T "== > <funca&& K 5= 9

La combinaci-n de &ambda y mapcar pueden reemp&a6ar muc'os buc&es. e3emp&o, &as suguien)es dos formas son e5ui/a&en)es0 > <do <<4 M< ( " : 5= <cdr 4== <y ni&== <<nu&& 4= <re/erse y== <pus' <E <car 4= (= y= = <" : 5 D J= > <mapcar IM<&ambda <4= <E 4 (== M< <" : 5 D J=

Por

( " : 5==

Ardenamien)o ++++++++++++ LISP dispone de dos primi)i/as para ordenamien)o0 sor) y s)ab&e+sor). > <sor) M<( < ( : 5 D= > <sor) M<( <D 5 : ( = 5 : D= IM<= 5 : D= IM>=

1& primer argumen)a oara sor) es una &is)a; e& segundo es una funci-n de comparaci-n. La funci-n sor) no garanr)i6aa es)abi&idad0 si 'ay dos e&e+ men)os a y b )a& 5ue <and <no) << a b== <no) << b a===, sor) puede dis+ poner&as en cua&5uier orden. La funci-n s)ab&e+sor) es e4ac)amen)e como sor), e4cep)a 5ue garean)i6a 5ue dos e&emen)os e5ui/a&en)es apare6can en &a &is)a ordenada en e& mismo orden 5ue apare4cen en &a &is)a origina&. %ay 5ue ser cuidadoso0 se permi)e 5ue sor) des)rya su argumen)o, de ma+ nera 5ue si &a secuencia origina& es impor)an)e, 'ay 5ue 'acer una copia con &a funci-n copy+&is) o copy+se5.

Igua&dad ++++++++ LISP )iene muc'as ideas diferen)es de igua&dad. La igua&dad num-rica es deno)ada por O. 8os s-mbo&os son e5 s- y s-&o si son id-n)icos. 8os co+ pias de &a misma &is)a no son e5, pero son igua&es. > <e5 Ma Ma= , > <e5 Ma Mb= .IL > <O " := , > <e5 M<a b c= M<a b c== .IL > <e5ua& M<a b c= M<a b c== , > <e5& Ma Ma= , > <e5& " "= , 1& predicado e5& es e5ui/a&en)e a e5 para s-mbo&os y a O para n-meros.

1& predicado e5ua& es e5ui/a&en)e a e5& para s-mbo&os y n-meros. 1s /er+ dad para dos conses si y s-&o sus cars son igua&es y sus cdrs son igua+ &es. 1s /erdad para dos es)ruc)uras si y s-&o si &as es)ruc)uras son de& mismo )ipo y sus correspondien)es campos son igua&es.

>&gunas funciones de &is)a -)i&es +++++++++++++++++++++++++++++++++ ,odas es)as funciones manipu&an &is)as. > <append M< ( "= M<: 5 D== ;conca)enar &is)s < ( " : 5 D= > <re/erse M< ( "== ;in/er)ir &os e&emen)os de una &is)a <" ( = > <member Ma M<b d a c== ;es)ab&ecer &a mebrec-a ++ regresa e& primer <> C= ; KK)ai& cuyo car es e& e&emen)o deseado > <find Ma M<b d a c== ;o)ra manera de es)ab&ecer &a membrec-a > > <find M<a b= M<<a d= <a d e= <a b d e= <== 0)es) IMsubse)p= <> $ 8 1= ;find is more f&e4ib&e )'oug' > <subse)p M<a b= M<a d e== ;se) con)ainmen) .IL > <in)ersec)ion M<a b c= M<b== ;se) in)ersec)ion <$= > <union M<a= M<b== ;se) union <> $= > <se)+difference M<a b= M<a== ;se) difference <$= Subse)p, in)ersec)ion, union, y se)+difference asumen 5ue cada argumen)o no con)iene no e&emen)os dup&icados++ <subse)p M<a a= M<a b b== se &e permi)e fa&&ar, por e3emp&o. find, subse)p, in)ersec)ion, union, y se)+difference pueden )omar una pa&abra c&a/e 0)es) por argumen)o; por defec)o, e&&as usan e5&.

Comen6ando con 1macs ++++++++++++++++++++ Se puede usar 1macs para edi)ar c-digo LISP0 muc'os 1macses es)-n confi+ gurados para es)ab&ecer e& modo LISP au)om-)icamen)e cuando encuen)ran un arc'i/o 5ue )ermina en .&isp, pero si es)e no es &e caso se puede usar KK#+4 &isp+mode. ,ambi-n se puede correr LISP ba3o 1macs0 'ay 5ue asegurarse 5ue 'ay una orden en &a /ariab&e de en)orno pa)' &&amada C&ispC 5ue corre )u LISP fa/ori)o. Por e3emp&o, se podr-a escribir &n +s ?usr?&oca&?bin?c&isp R?bin?&isp Luego en 1macs se puede escribir #+4 run+&isp. Se puede en/iar c-digo LISP a& LISP inicia&i6ado, y 'acer )odos &os ordenamien)os de o)ras co+ sas in)eresan)es; para mayor informaci-n, escribir C+' m desde cua&5uier buffer 5ue es)- en modo LISP.

Bea&men)e no se necesi)ar- 'acer un en&ace. 1macs )iene una /ariab&e &&amada inferior+&isp+program; as- 5ue si se agrega &a &-nea <se)5 inferior+&isp+program C?usr?&oca&?bin?c&ispC= a& arc'i/o .emacs, #+4 run+&isp. 1macs sabrdonde encon)rar CLISP cuando se escriba

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1AF

Potrebbero piacerti anche