2 I N T R O D U C C I Ó N A L I S P

Please download to get full document.

View again

All materials on our website are shared by users. If you have any questions about copyright issues, please report us to resolve them. We are always happy to assist you.
Share
Transcript
  2  INTRODUCCIÓN A LISP El objetivo de este capítulo es que puedan programar en Lisp tan pronto como seaposible. Al final de la misma, conocerán lo suficiente de Lisp como para comenzar aescribir sus propios programas. Este material debe revisarse como un tutorial básicosobre el lenguaje Lisp. Esta presentación se complementa con la revisión del capítulotres del libro de Seibel [ 22 ]. ￿ . 󿿿 􏿿󟿿􏿿􏿿 Es particularmente cierto que la mejor forma de aprender Lisp es usándolo, porquese trata de un lenguaje interactivo. Cualquier sistema Lisp, incluye una interfaz in-teractiva llamada  top-level . Uno escribe expresiones Lisp en el top-level, y el siste-ma despliega sus valores. El sistema normalmente despliega un indicador llamado prompt  ( > ) señalando que está esperando que una expresión sea escrita. Por ejemplo,si escribímos el entero  1  después del prompt y tecleamos  enter , tenemos: > 11> el sistema despliega el valor de la expresión, seguida de un nuevo prompt, indicandoque está listo para  evaluar  una nueva expresión. En este caso, el sistema desplególo mismo que tecleamos porque los números, como otras constantes, evalúan a simismos. Las cosas son más interesantes cuando una expresión necesita algo de trabajopara ser evaluado, por ejemplo, sumar dos números: > (+ 2 3)5> En la expresión  (+ 2 3)  el símbolo  +  es llamado el  operador  y los números  3  y  4 son sus  argumentos  (o parámetros actuales, siguendo la notación introducida en elcapítulo anterior). Como el operador viene al principio de la expresión, esta notaciónse conoce como  prefija  y aunque parezca extraña, veremos que es muy práctica. Porejemplo, si queremos sumar tres números en notación  infija , necesitaríamos usar dosveces el operador  + :  2 + 3 + 4 . En Lisp, las siguientes sumas son válidas: > (+)0> (+ 2)2> (+ 2 3)5 15  16     > (+ 2 3 5)10 Como los operadores pueden tomar un número variable de argumentos, es necesa-rio utilizar los paréntesis para indicar donde inicia y donde termina una expresión.Las expresiones pueden anidarse, esto es, el argumento de una expresión puede serotra expresión compleja. Ej. > (/ (- 7 1)(- 4 2))3 En español esto corresponde a siete menos uno, dividido por cuatro menos dos. Estética minimalista , esto es todo lo que hay que decir sobre la notación en Lisp.Toda expresión Lisp es un  átomo , como  1 , o bien es una  lista  que consiste de cero omás expresiones delimitadas por paréntesis. Como veremos, código y datos usan lamisma notación en Lisp. ￿ . ￿ 􏿿 Veamos más en detalle como las expresiones son evaluadas para desplegar su valor enel top-level. En Lisp,  +  es una función y  (+ 2 3)  es una  llamada  a la función. CuandoLisp evalúa una llamada a alguna función, lo hace en dos pasos: 1 . Los argumentos de la llamada son evaluados de izquierda a derecha. En estecaso, los valores de los argumentos son  2  y  3 , respectivamente. 2 . Los valores de los argumentos son pasados a la función nombrada por el opera-dor. En este caso la función  +  que regresa  5 .Si alguno de los argumentos es a su vez una llamada de función, será evaluado conlas mismas reglas. Ej. Al evaluar la expresión (/ (-  7 1 ) (-  4 2 )) pasa lo siguiente. 1 . Lisp evalúa el primer argumento de izquierda a derecha (-  7 1 ).  7  es evaluadocomo  7  y  1  como  1 . Estos valores son pasados a la función - que regresa  6 . 2 . El siguiente argumento (-  4 2 ) es evaluado.  4  es evaluado como  4  y  2  como  2 .Estos valores son pasados a la función - que regresa  2 . 3 . Los valores  6  y  2  son pasados a la función / que regresa  3 .No todos los operadores en Lisp son funciones, pero la mayoría lo son. Todas lasllamadas a función son evaluadas de esta forma, que se conoce como  regla de evalua-ción  de Lisp. Los operadores que no siguen la regla de evaluación se conocen como operadores especiales . Uno de estos operadores especiales es  quote  (’). La regla deevaluación de  quote  es –No evalues nada, despliega lo que el usuario tecleo,  verbatim .Por ejemplo: > (quote (+ 2 3))(+ 2 3)> ’(+ 2 3)(+ 2 3)  ￿ .    17 Lisp provee el operador  quote  como una forma de evitar que una expresión seaevaluada. En la siguiente sección veremos porque esta protección puede ser útil. ￿ .   Lisp ofrece los tipos de datos que podemos encontrar en otros lenguajes de programa-ción, y otros que no. Ya hemos usado  enteros  en los ejemplos precedentes. Las cadenas de caracteres se delimita por comillas, por ejemplo,  “Hola mundo” . Enteros y cadenasevalúan a ellos mismos, como las constantes.Dos tipos de datos propios de Lisp son los  símbolos  y las  listas . Los símbolosson palabras. Normalmente se evaluan como si estuvieran escritos en mayúsculas,independientemente de como fueron tecleados: > ’unoUNO Los símbolos por lo general no evaluan a si mismos, así que si es necesario referirsea ellos, se debe usar  quote , como en ejemplo anterior, de lo contrario, se produciráun error ya que el símbolo  uno  no está acotado (no tiene ligado ningún valor en estemomento).Las listas se representan como cero o más elementos entre paréntesis. Los elementospueden ser de cualquier tipo, incluidas las listas. Se debe usar  quote  con las listas, yaque de otra forma Lisp las tomaría como una llamada a función. Veamos algunosejemplos: > ’(Mis 2 "ciudades")(MIS 2 "CIUDADES")> ’(La lista (a b c) tiene 3 elementos)(LA LISTA (A B C) TIENE 3 ELEMENTOS) Observen que  quote  protege a toda la expresión, incluidas las sub-expresiones enella. La lista  (a b c) , tampoco fue evaluada. También es posible construir listas usan-do la función  list : > (list ’mis (+ 4 2) "colegas")(MIS 6 COLEGAS) Estética minimalista y  pragmática , observen que los programas Lisp se representancomo listas. Si el argumento estético no bastará para defender la notación de Lisp,esto debe bastar –Un programa Lisp puede generar código Lisp! Por eso es necesario quote . Si una lista es precedida por el operador  quote , la evaluación regresa la mismalista, en otro caso, la lista es evaluada como si fuese código. Por ejemplo: > (list ’(+ 2 3) (+ 2 3))((+ 2 3) 5) En Lisp hay dos formas de representar la lista vacia, como un par de paréntesis ocon el símbolo  nil . Ej.  18     > ()NIL> NILNIL ￿ .  􏿿􏿿    La función  cons  construye listas. Si su segundo argumento es una lista, regresa unanueva lista con el primer argumento agregado en el frente. Ej. > (cons ’a ’(b c d))(A B C D)> (cons ’a (cons ’b nil))(A B) Las funciones primitivas para accesar los elementos de una lista son  car  y  cdr . El car  de una lista es su primer elemento (el más a la izquierda) y el  cdr  es el resto dela lista (menos el primer elemento). Ej. > (car ’(a b c))A> (cdr ’(a b c))(B C) Se pueden usar combinaciones de  car  y  cdr  para accesar cualquier elemento de lalista. Ej. > (car (cdr (cdr ’(a b c d))))C> (caddr ’(a b c d))C> (third ’(a b c d))C ￿ .  􏿿 􏿿 􏿿 En Lisp, el símbolo  t  es la representación por default para verdadero. La represen-tación por default de falso es  nil . Ambos evaluan a si mismos. Ej. La función  listp regresa verdadero si su argumento es una lista: > (listp ’(a b c))T> (listp 34)NIL  ￿ .  􏿿 􏿿 􏿿  19 Una función cuyo valor de regreseo se intérpreta como un valor de verdad (ver-dadero o falso) se conoce como  predicado . En lisp es común que el símbolo de unpredicado termine en  p .Como  nil  juega dos roles en Lisp, las funciones  null  (lista vacía) y  not  (negación)hacen exactamente lo mismo: > (null nil)T> (not nil)T El condicional (estructura de control) más simple en Lisp es  if . Normalmente tomatres argumentos: una expresión  test , una expresión  then  y una expresión  else . Laexpresión  test  es evaluada, si su valor es verdadero, la expresión  then  es evaluada; sisu valor es falso, la expresión  else  es evaluada. Ej. > (if (listp ’(a b c d))(+ 1 2)(+ 3 4))3> (if (listp 34)(+ 1 2)(+ 3 4))7 Como  quote ,  if  es un operador especial. No puede implementarse como una fun-ción, porque los argumentos de una función siempre se evaluan, y la idea al usar  if es que sólo uno de sus argumentos sea evaluado.Si bien el default para representar verdadero es  t , todo excepto  nil  cuenta comoverdadero en un contexto lógico. Ej. > (if 27 1 2)1> (if nil 1 2)2 Los operadores lógicos  and  y  or  parecen condicionales. Ambos toman cualquier nú-mero de argumentos, pero solo evaluan los necesarios para decidir que valor regresar.Si todos los argumentos son verdaderos (diferentes de  nil ), entonces  and  regresa elvalor del último argumento. Ej. > (and t (+ 1 2))3 Pero si uno de los argumentos de  and  resulta falso, ninguno de los argumentosposteriores es evaluado y el operador regresa  nil . De manera similar,  or  se detieneen cuanto encuentra un elemento verdadero. > (or nil nil (+ 1 2) nil)3
Related Search
Similar documents
View more
We Need Your Support
Thank you for visiting our website and your interest in our free products and services. We are nonprofit website to share and download documents. To the running of this website, we need your help to support us.

Thanks to everyone for your continued support.

No, Thanks