+ All Categories
Home > Documents > Metodolog´ıas de Programaci on II´ Introduccion a … a Lisp´ Dr. Alejandro Guerra-Hernandez´...

Metodolog´ıas de Programaci on II´ Introduccion a … a Lisp´ Dr. Alejandro Guerra-Hernandez´...

Date post: 16-Oct-2018
Category:
Upload: lamxuyen
View: 222 times
Download: 0 times
Share this document with a friend
93
Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteraci ´ on as Funciones Metodolog´ ıas de Programaci ´ on II Introducci ´ on a Lisp Dr. Alejandro Guerra-Hern´ andez Departamento de Inteligencia Artificial Facultad de F´ ısica e Inteligencia Artificial [email protected] http://www.uv.mx/aguerra Maestr´ ıa en Inteligencia Artificial 2012
Transcript

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Metodologıas de Programacion IIIntroduccion a Lisp

Dr. Alejandro Guerra-Hernandez

Departamento de Inteligencia ArtificialFacultad de Fısica e Inteligencia Artificial

[email protected]://www.uv.mx/aguerra

Maestrıa en Inteligencia Artificial 2012

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Objetivo

I Poder programar en Lisp tan pronto como sea posible.I Al final del tutorial [2], conoceran lo suficiente de Lisp

como para comenzar a escribir sus propios programas.

PS Y el alien de Barski es casi Halcon de la UV!

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Top-Level

I Uno escribe expresiones Lisp en el Top-Level, y el sistemadespliega sus valores. El prompt > indica que Lispesta esperando que una expresion sea escrita. Laexpresion es evaluada al pulsar enter.

1 > 12 13 >

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Calculadora

I Las cosas son mas interesantes cuando una expresionnecesita algo de trabajo para ser evaluado. Ej. Sumar dosnumeros:

1 > (+ 2 3)2 53 >

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Operador, Argumentos, Prefijo

I En la expresion (+ 2 3) el + es llamado el operador y losnumeros 2 y 3 son sus argumentos.

I Como el operador viene al principio de la expresion, estanotacion se conoce como prefija y aunque parezca extranaal principio, veremos que es uno de los aspectossobresalientes de Lisp.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Generalidad del prefijo

I Si queremos sumar tres numeros en notacion “normal”(infija), necesitarıamos usar dos veces el operador +:2+3+4. En Lisp solo necesitamos agregar otro argumento:

1 > (+)2 03 > (+ 2)4 25 > (+ 2 3)6 57 > (+ 2 3 5)8 10

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Parentesis

I Como los operadores pueden tomar un numero variablede argumentos, es necesario utilizar los parentesis paraindicar donde inicia y donde termina una expresion. Lasexpresiones se pueden anidar:

1 > (/ (- 7 1)(- 4 2))2 3

I En espanol esto corresponde a siete menos uno, divididopor cuatro menos dos.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Estetica minimalista

I Esto es todo lo que hay que decir sobre la notacion enLisp. Toda expresion Lisp es un atomo, como 1, o bien esuna lista que consiste de cero o mas expresionesdelimitadas por parentesis.

I Codigo y datos usan esta notacion en Lisp.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Evaluacion

I En Lisp, + es una funcion y (+ 2 3) es una llamada a lafuncion. Cuando Lisp evalua una llamada a algunafuncion, lo hace en dos pasos:

1. Los argumentos de la llamada son evaluados de izquierdaa derecha. En este caso, los valores de los argumentos son2 y 3, respectivamente.

2. Los valores de los argumentos son pasados a la funcionnombrada por el operador. En este caso la funcion + queregresa 5.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Evaluacion recursiva.

I Si alguno de los argumentos es a su vez una llamada defuncion, sera evaluado con las mismas reglas. Ej. Alevaluar la expresion (/ (- 7 1) (- 4 2)) pasa lo siguiente:

1. Lisp evalua el primer argumento de izquierda a derecha (-7 1). 7 es evaluado como 7 y 1 como 1. Estos valores sonpasados a la funcion - que regresa 6.

2. El siguiente argumento (- 4 2) es evaluado. 4 es evaluadocomo 4 y 2 como 2. Estos valores son pasados a la funcion- que regresa 2.

3. Los valores 6 y 2 son pasados a la funcion / queregresa 3.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Operadores especiales (quote)

I Un operador Lisp que no sigue la regla de evaluacion esquote (’). Se trata de un operador especial.

I La regla de evaluacion de quote es –No hagas nada,despliega lo que el usuario tecleo. Ej.

1 > (quote (+ 2 3))2 (+ 2 3)3 > ’(+ 2 3)4 (+ 2 3)

I Lisp provee el operador quote como una forma de evitarque una expresion sea evaluada. En la siguiente seccionveremos porque esta proteccion puede ser util.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Datos

I Lisp ofrece los tipos de datos que podemos encontrar enotros lenguajes de programacion y otros que no.

I Un tipo de datos que ya usamos es el entero, que seescribe como una secuencia de dıgitos. Ej. 256.

I Otro tipo de datos es la cadena de caracteres que sedelimita por comillas. Ej., “ora et labora, pos ora”. Enterosy cadenas evaluan a ellos mismos.

1 > 2562 2563 > "ora et labora"4 "ora et labora"

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Sımbolos

I Los sımbolos son palabras. Normalmente se evaluancomo si estuvieran escritos en mayusculas,independientemente de como fueron tecleados. Ej.

1 > ’Amarone2 AMARONE

I Los sımbolos por lo general no evaluan a si mismos,ası que si es necesario referirse a ellos, se debe usarquote, como en ejemplo anterior.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Listas

I Las listas se representan como cero o mas elementosentre parentesis.

I Los elementos pueden ser de cualquier tipo, incluidas laslistas.

I Se debe usar quote con las listas, ya que de otra formaLisp las tomarıa como una llamada a funcion. Ej.

1 > ’(Mis 2 "ciudades")2 (MIS 2 "CIUDADES")3 > ’(La lista (a b c) tiene 3 elementos)4 (LA LISTA (A B C) TIENE 3 ELEMENTOS)

I Observen que un solo quote protege a toda laexpresion, incluidas las expresiones en ella.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Construccion de Listas (list)

I Se puede construir listas usando el operador list que esuna funcion, y por lo tanto, sus argumentos son evaluados.Ej.

1 > (list ’mis (+ 4 2) "colegas")2 (MIS 6 COLEGAS)

I Estetica minimalista y pragmatica, observen que losprogramas Lisp se representan como listas. Si elargumento estetico no bastara para defender la notacionde Lisp, esto debe bastar –Un programa Lisp puedegenerar codigo Lisp! Por eso es necesario quote.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Proteccion de listas

I Si una lista es precedida por el operador quote, laevaluacion regresa la misma lista, en otro caso, la lista esevaluada como si fuese codigo. Ej.

1 > (list ’(+ 2 3) (+ 2 3))2 ((+ 2 3) 5)

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Lista vacia

I En Lisp hay dos formas de representar la lista vacia, comoun par de parentesis o con el sımbolo NIL. Ej.

1 > ()2 NIL3 > NIL4 NIL

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Constructor de listas (cons)

I La funcion cons construye listas. Si su segundoargumento es una lista, regresa una nueva lista con elprimer argumento agregado en el frente. Ej.

1 > (cons ’a ’(b c d))2 (A B C D)3 > (cons ’a (cons ’b nil))4 (A B)

I El segundo ejemplo es equivalente a:

1 > (list ’a ’b)2 (A B)

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Acceso a listas (car y cdr)

I Las funciones primitivas para accesar los elementos deuna lista son car y cdr. El car de una lista es su primerelemento (el mas a la izquierda) y el cdr es el resto de lalista (menos el primer elemento). Ej.

1 > (car ’(a b c))2 A3 > (cdr ’(a b c))4 (B C)

I Los nombres modernos para esta funciones son first yrest, pero...

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Combinaciones de car y cdr

I Se pueden usar combinaciones de car y cdr paraaccesar cualquier elemento de la lista. Ej.

1 > (car (cdr (cdr ’(a b c d))))2 C3 > (caddr ’(a b c d))4 C5 > (third ’(a b c d))6 C

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Valores de verdad

I El sımbolo t representa por default verdadero.I La representacion por default de falso es nil !I Ambos evaluan a si mismos.I Ej. El predicado listp regresa verdadero si su argumento

es una lista:

1 > (listp ’(a b c))2 T3 > (listp 34)4 NIL

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Predicados

I Una funcion cuyo valor de regreso se interpreta como unvalor de verdad (verdadero o falso) se conoce comopredicado.

I En lisp es comun que el sımbolo de un predicado termineen p.

I Como nil juega dos roles en Lisp, las funciones null(lista vacıa) y not (negacion) hacen exactamente lomismo:

1 > (null nil)2 T3 > (not nil)4 T

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Condicional (if)

I El condicional mas simple en Lisp es if.I Normalmente toma tres argumentos: una expresion test,

una expresion then y una expresion else.I La expresion test es evaluada, si su valor es verdadero, la

expresion then es evaluada; si su valor es falso, laexpresion else es evaluada:

1 > (if (listp ’(a b c d))2 (+ 1 2)3 (+ 3 4))4 35 > (if (listp 34)6 (+ 1 2)7 (+ 3 4))8 7

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

If es una macro [1]

I Como quote, if es un operador especial.I No puede implementarse como una funcion, porque los

argumentos de una funcion siempre se evaluan, y la ideaal usar if es que solo uno de sus argumentos seaevaluado.

I Si bien el default para representar verdadero es t, todoexcepto nil cuenta como verdadero en un contextologico:

1 > (if 27 1 2)2 13 > (if nil 1 2)4 2

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Operadores Logicos

I Los operadores logicos and y or parecen condicionales.I Ambos toman cualquier numero de argumentos, pero solo

evaluan los necesarios para decidir que valor regresar.I Si todos los argumentos son verdaderos (diferentes denil), entonces and regresa el valor del ultimo argumento.Ej.

1 > (and t (+ 1 2))2 3

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Evaluacion de operadores logicos

I Pero si uno de los argumentos de and resulta falso,ninguno de los argumentos posteriores es evaluado y eloperador regresa nil.

I De manera similar, or se detiene en cuanto encuentra unelemento verdadero.

1 > (or nil nil (+ 1 2) nil)2 3

I Observen que los operadores logicos son operadoresespeciales, en este caso definidos como macros.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Definicion de funciones

I Es posible definir nuevas funciones con defun que tomanormalmente tres argumentos: un nombre, una lista deparametros y una o mas expresiones que conforman elcuerpo de la funcion.

I Ej. Ası definirıamos tercero:

1 > (defun tercero (lst)2 (caddr lst))3 TERCERO

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Defun

I El primer argumento de defun indica que el nombre denuestra funcion definida sera tercero.

I El segundo argumento (lst) indica que la funcion tieneun solo argumento, lst. Un sımbolo usado de esta formase conoce como variable. Cuando la variable representa elargumento de una funcion, se conoce como parametro.

I El resto de la definicion indica lo que se debe hacer paracalcular el valor de la funcion, en este caso, para cualquierlst, se calculara el primer elemento, del resto, del restodel parametro (caddr lst). Ej.

1 > (tercero ’(a b c d e))2 C

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Sımbolos, listas y variables

I Ahora que hemos introducido el concepto de variable, esmas sencillo entender lo que es un sımbolo.

I Los sımbolos son nombres de variables, que existen conderechos propios en el lenguaje Lisp.

I Por ello sımbolos y listas deben protegerse con quotepara ser accesados.

I Una lista debe protegerse porque de otra forma esprocesada como si fuese codigo; un sımbolo debeprotegerse porque de otra forma es procesado como sifuese una variable.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Funciones como generalizacion

I Podrıamos decir que la definicion de una funcioncorresponde a la version generalizada de una expresionLisp.

I Ej. La siguiente expresion verifica si la suma de 1 y 4 esmayor que 3:

1 > (> (+ 1 4) 3)2 T

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Generalizando

I Substituyendo los numeros partıculares por variables,podemos definir una funcion que verifica si la suma de susdos primeros argumentos es mayor que el tercero:

1 > (defun suma-mayor-que (x y z)2 (> (+ x y) z))3 SUMA-MAYOR-QUE4 > (suma-mayor-que 1 4 3)5 T

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Programacion incremental

I Lisp no distigue entre programa, procedimiento y funcion;todos cuentan como funciones y de hecho, casi todo ellenguaje esta compuesto de funciones.

I Si se desea considerar una funcion en partıcular comomain, es posible hacerlo, pero cualquier funcion puede serllamada desde el top-level.

I Entre otras cosas, esto significa que posible probarnuestros programas, pieza por pieza, conforme los vamosescribiendo, lo que se conoce como programacionincremental (bottom-up).

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Recursividad

I Las funciones que hemos definido hasta ahora, llaman aotras funciones para hacer una parte de sus calculos. Ej.suma-mayor-que llama a las funciones + y >.

I Una funcion puede llamar a cualquier otra funcion, incluidaella misma.

I Una funcion que se llama a si misma se conoce comorecursiva.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Miembro de

I En Lisp la funcion member verifica cuando algo esmiembro de una lista. He aquı una version recursivasimplificada de esta funcion:

1 > (defun miembro (obj lst)2 (if (null lst)3 nil4 (if (eql (car lst) obj)5 lst6 (miembro obj (cdr lst)))))7 MIEMBRO

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Miembro de (Cont...)

I El predicado eql verifica si sus dos argumentos sonidenticos, el resto lo hemos visto previamente.

I La llamada a miembro es como sigue:

1 > (miembro ’b ’(a b c))2 (B C)3 > (miembro ’z ’(a b c))4 NIL

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Miembro en espanol

I La descripcion en espanol de lo que hace la funcionmiembro es como sigue:

1. Primero, verificar si la lista lst esta vacıa, en cuyo caso esevidente que obj no es un miembro de lst.

2. De otra forma, si obj es el primer elemento de lstentonces es miembro de la lista.

3. De otra forma, obj es miembro de lst unicamente si esmiembro del resto de lst.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Falsa Paradoja

I Traducir una funcion recursiva a una descripcion como laanterior, siempre ayuda a entenderla.

I En gran medida esto se debe a que usamos la metaforaequivocada de funcion. Tenemos la tendencia de pensaren una funcion como cierta forma de maquina, donde lasmaterias primas llegan como parametros. Parte del trabajose da por encargo a otras funciones y el resultado final seempaqueta y se expide como el valor de la funcion.

I Si se usa esta metafora la recursividad resulta paradojica– ¿Que sentido tiene darse por encargo trabajo cuandouno ya esta ocupado?

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Metafora de funcion

I Una metafora mas adecuada es ver a las funciones comoprocesos que vamos resolviendo.

I Solemos usar procesos recursivos en nuestras actividadesdiarias.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Estudiante sonado

I Por ejemplo, supongan a un estudiante de IA queesta interesado en Lisp.

I Va a la biblioteca y el proceso que utilizarıa para examinarun documento es el siguiente:

1. Obtener una copia del documento que le interesa.2. Buscar en el la informacion relativa a Lisp.3. Si el documento menciona otros documentos que puede

ser utiles, examinarlos.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

De regreso a Miembro

I Piensen en miembro como las reglas que definen cuandoalgo es miembro de una lista y no como una maquina quecomputa si algo es miembro de una lista. De esta forma, laparadoja desaparece.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Estetica

I Si bien los parentesis delimitan las expresiones en Lisp, unprogramador en realidad usa los margenes en el codigopara hacerlo mas legible.

I Casi todo editor puede configurarse para verificarparentesis bien balanceados. Ej. :set sm en el editor vi;o M-x lisp-mode en Emacs.

I Cualquier hacker en Lisp tendrıa problemas para leer algocomo:

1 > (defun miembro (obj lst) (if (null lst)2 nil (if (eql (car lst) obj) lst3 (miembro obj (cdr lst)))))4 MIEMBRO

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Entradas y salidas

I Hasta el momento hemos procesado las E/Simplıcitamente, utilizando el top-level.

I Para programas interactivos esto no es suficiente. Dehecho, casi todo el software actual incluye alguna interfazgrafica, por ejemplo, en lisp: CLIM, Common Graphics, etc.

I En este tutorial de introduccion solo veremos algunasoperaciones basicas de E/S.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Salida (format)

I Esta funcion toma dos o mas argumentos: el primeroindica donde debe imprimirse la salida, el segundo es unacadena que se usa como molde (template), y el resto songeneralmente objetos cuya representacion impresasera insertada en la cadena molde. Ej.

1 > (format t "˜A mas ˜A igual a ˜A. ˜%"2 2 3 (+ 2 3))3 2 MAS 3 IGUAL A 5.4 NIL

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Evaluacion de format

I Observen que dos lıneas fueron desplegadas en elejemplo anterior.

I La primera es producida por format y la segunda es elvalor devuelto por la llamada a format, desplegada por eltop-level como se hace con toda funcion.

I Normalmente no llamamos a format en el top-level, sinodentro de alguna funcion, por lo que el valor que regresaqueda generalmente oculto.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Format en detalle

I El primer argumento de format, t, indica que la salidasera desplegada en el dispositivo estandar de salida,generalmente el top-level.

I El segundo argumento es una cadena que sirve comomolde de lo que sera impreso. Dentro de esta cadena,cada A reserva espacio para insertar un objeto y el%indica un salto de lınea.

I Los espacios reservados de esta forma, son ocupados porel resto de los argumentos en el orden en que sonevaluados.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Entrada (read)

I Sin argumentos, normalmente la lectura se hace a partirdel top-level. Ej. Una funcion que despliega un mensaje ylee la respuesta el usuario:

1 > (defun pregunta (string)2 (format t "˜A" string)3 (read))4 PREGUNTA5 > (pregunta "Su edad: ")6 Su edad: 347 34

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Read viene acompanado

I Puesto que read espera indefinidamente a que el usuarioescriba algo, no es recomendable usar read sin desplegarantes un mensaje que solicite la informacion al usuario. Deotra forma el sistema dara la impresion de haberseplantado.

I Se debe mencionar que read hace mucho mas que leercaracteres, es un autentico parser de Lisp que evalua suentrada y regresa los objetos que se hallan generado.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Secuencias de expresiones

I La funcion pregunta, aunque corta, muestra algo que nohabıamos visto antes: su cuerpo incluye mas de unaexpresion Lisp.

I El cuerpo de una funcion puede incluir cualquier numerode expresiones.

I Cuando la funcion es llamada, las expresiones en sucuerpo son evaluadas en orden y la funcion regresara elvalor de la ultima expresion evaluada.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Efectos colaterales y Lisp puro

I Hasta el momento, lo que hemos mostrado se conocecomo Lisp puro, esto es, Lisp sin efectos colaterales.

I Un efecto colateral es un cambio en el sistema Lispproducto de la evaluacion de una expresion.

I Cuando evaluamos (+ 2 3), no hay efectos colaterales,el sistema simplemente regresa el valor 5. Pero al usarformat, ademas de obtener el valor nil, el sistemaimprime algo, esto es un tipo de efecto colateral.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Lisp puro y expresiones

I Cuando se escribe codigo sin efectos colaterales, no hayrazon alguna para definir funciones cuyo cuerpo incluyemas de una expresion.

I La ultima expresion evaluada en el cuerpo producira elvalor de la funcion, pero el valor de las expresionesevaluadas antes se perdera.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Variables (let)

I Uno de los operadores mas comunes en Lisp es let, quepermite la creacion de nuevas variables locales. Ej.

1 > (let ((x 1)(y 2))2 (+ x y))3 3

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Estructura de let

I Una expresion let tiene dos partes: Primero viene unalista de expresiones definiendo las nuevas variableslocales, cada una de ellas con la forma (variableexpresion).

I Cada variable es inicializada con el valor que regrese laexpresion asociada a ella. En el ejemplo anterior se hancreado dos variables, x e y, con los valores 1 y 2respectivamente.

I Esas variables son validas dentro del cuerpo de let.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Estructura de let (Cont...)

I Despues de la lista de variables y valores, viene el cuerpode let constituido por una serie de expresiones que sonevaluadas en orden.

I En el ejemplo, solo hay una llamada a +.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Preguntar con reservas

I Presento ahora como ejemplo una funcion preguntarmas selectiva:

1 > (defun preguntar-num ()2 (format t "Por favor, escriba un numero: ")3 (let ((val (read)))4 (if (numberp val)5 val6 (preguntar-num))))7 PREGUNTAR-NUM

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Variables locales

I Esta funcion crea la variable local var para guardar elvalor que regresa read.

I Como este valor puede ahora ser manipulado por Lisp, lafuncion revisa que se ha escrito para decidir que hacer. Siel usuario ha escrito algo que no es un numero, la funcionvuelve a llamarse a si misma:

1 > (preguntar-num)2 Por favor, escriba un numero: a3 Por favor, escriba un numero: (un numero)4 Por favor, escriba un numero: 35 3

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Variables globales

I Se puede crear una variable global con un sımbolo dado yun valor, usando defparameter:

1 > (defparameter *glob* 1970)2 *GLOB*

I Esta variable es visible donde sea, salvo en contextos quedefinan una variable local con el mismo nombre.

I Para evitar errores accidentales con los nombre de lasvariables, se usa la convencion de nombrar a las variablesglobales con sımbolos que inicien y terminen enasterisco.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Constantes globales

I Se pueden definir tambien constantes globales usandodefconstant:

1 > (defconstant limit (+ *glob* 1))

I No hay necesidad de dar a las constantes nombresdistintivos porque si se intenta usar el nombre de unaconstante para una variable se produce un error.

I Para verificar si un sımbolo es el nombre de una variableglobal o constante, se puede usar boundp:

1 > (boundp ’*glob*)2 T

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Asignaciones (setf)

I En Lisp el operador de asignacion mas comun es setf.Se puede usar para asignar valores a cualquier tipo devariable. Ej.

1 > (seft *glob* 2000)2 20003 > (let ((n 10))4 (setf n 2)5 n)6 2

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Estructura de setf

I Cuando el primer argumento de setf es un sımbolo queno es el nombre de una variable local, se asume que setrata de una variable global.

1 > (setf x (list ’a ’b ’c))2 (A B C)3 > (car x)4 A

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Versatilidad de setf

I Se puede hacer mas que simplemente asignar valores avariables. El primer argumento de setf puede ser tantouna expresion, como un nombre de variable.

I En el primer caso, el valor representado por el segundoargumento es insertado en el lugar al que hace referenciala expresion. Ej.

1 > (setf (car x) ’n)2 N3 > x4 (N B C)

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Versatilidad de setf (cont...)

I Se puede dar cualquier numero de argumentos pares asetf. Una expresion de la forma:

1 > (setf a ’b c ’d e ’f)2 F

I es equivalente a:

1 > (set a ’b)2 B3 > (set b ’c)4 C5 > (set e ’f)6 F

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Programacion funcional

I La programacion funcional significa, entre otras cosas,escribir programas que trabajan regresando valores, enlugar de modificar cosas.

I Era el paradigma de programacion dominante en Lisp,aunque ahora se favorece el paradigma orientado aobjetos conocido como CLOS [3].

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Remove

I La funcion remove, por ejemplo, toma un atomo y unalista y regresa una nueva lista que contiene todos loselementos de la lista original, mejos el atomo indicado:

1 > (setf lst ’(k a r a t e))2 (K A R A T E)3 > (remove ’a lst)4 (K R T E)

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Remove ¿remueve?

I ¿Por que no decir simplemente que remove remueve unobjeto dado de una lista? Porque esto no es lo que lafuncion hace. La lista original no es modificada:

1 > lst2 (K A R A T E)

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Asignacion destructiva

I Si se desea que la lista original sea afectada, se puedeevaluar la siguiente expresion:

1 > (setf lst (remove ’a lst))2 (K R T E)3 > lst4 (K R T E)

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Mınimo uso de setf

I La programacion funcional significa, escencialmente, evitarsetf y otras expresiones con el mismo tipo de efectocolateral.

I Esto puede parecer contra intuitivo y hasta no deseable. Sibien programar totalmente sin efectos colaterales esinconveniente, a medida que practiquen Lisp, sesoprenderan de lo poco que en realidad se necesita estetipo de efecto.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Verificacion interactiva

I Una de las ventajas de la programacion funcional es quepermite la verificacion interactiva.

I En codigo puramente funcional, se puede verificar cadafuncion a medida que se va escribiendo.

I Si la funcion regresa los valores que esperamos, se puedeconfiar en que es correcta. La confianza agregada alproceder de este modo, hace una gran diferencia: unnuevo estilo de programacion.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Iteracion

I Cuando deseamos programar algo repetitivo, algunasveces la iteracion resulta mas natural que la recursividad.

1 > (defun cuadrados (inicio fin)2 (do ((i inicio (+ i 1)))3 ((> i fin) ’final)4 (format t "˜A ˜A ˜%" i (* i i))))5 CUADRADOS6 > (cuadradros 2 5)7 2 48 3 99 4 16

10 5 2511 FINAL

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

La macro Do

I Es el operador fundamental de iteracion en Lisp.I Como let, do puede crear variables y su primer

argumento es una lista de especificacion de variables.I Cada elemento de esta lista toma la forma (variable

valor-inicial actualizacion).I En cada iteracion el valor de las variables definidas de

esta forma, cambia como lo especifica la actualizacion.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

La macro do (parada)

I El segundo argumento de do debe ser una lista queincluya una o mas expresiones.

I La primera expresion se usa como prueba para determinarcuando debe parar la iteracion. En el ejemplo, esta pruebaes (> i fin).

I El resto de la lista sera evaluado en orden cuando laiteracion termine. La ultima expresion evaluada sera elvalor de do, por lo que cuadrados, regresa siempre elvalor ’final.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

La macro do (cuerpo)

I El resto de los argumentos de do, constituyen el cuerpodel ciclo y seran evaluados en orden en cada iteracion,donde: las variables son actualizadas, se evalua la pruebade fin de iteracion y si esta falla, se evalua el cuerpo de do.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Cuadrados recursiva

I Para comparar, se presenta aquı una version recursiva decuadrados:

1 > (defun cuadrados (inicio fin)2 (if (> inicio fin)3 ’final4 (progn5 (format t "˜A ˜A ˜%"6 inicio (* inicio inicio))7 (cuadrados (+ inicio 1) fin))))8 CUADRADOS

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Secuencias de expresiones (progn)

I La unica novedad en esta funcion es progn que tomacualquier numero de expresiones como argumentos, lasevalua en orden y regresa el valor de la ultima expresionevaluada.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Iteracion con dolist

I Lisp provee operadores de iteracion mas sencillos paracasos especiales, por ejemplo, dolist para iterar sobrelos elementos de una lista. Ej. Una funcion que calcula lalongitud de una lista:

1 > (defun longitud (lst)2 (let ((len 0))3 (dolist (obj lst)4 (setf len (+ len 1)))5 len))6 LONGITUD7 > (longitud ’(a b c))8 3

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Estructura de dolist

I El primer argumento de dolist toma la forma (variableexpresion), el resto de los argumentos son expresionesque constituyen el cuerpo de dolist.

I Este cuerpo sera evaluado con la variable instanciadacon elementos sucesivos de la lista que regresaexpresion.

I La funcion del ejemplo, dice – por cada obj en lst,incrementar en uno len.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Longitud recursiva

I La version recursiva obvia de esta funcion longitud es:

1 > (defun longitud-rec (lst)2 (if (null lst)3 04 (+ (longitud-rec (cdr lst)) 1)))5 LONGITUD

I Esta version sera menos eficiente que la iterativa porqueno es recursiva a la cola (tail-recursive), es decir, alterminar la recursividad, la funcion debe seguir haciendoalgo.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Recursion a la cola

I La definicion recursiva a la cola de longitud es:

1 > (defun longitud-tr (lst)2 (labels ((longaux (lst acc)3 (if (null lst)4 acc5 (longaux (cdr lst)6 (+ 1 acc)))))7 (longaux lst 0)))8 LONGITUD-TR

I Lo nuevo aquı es labels que permite definir funcioneslocales como longaux.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Funciones de primera clase

I En Lisp las funciones son objetos regulares como lossımbolos, las cadenas y las listas.

I Si le damos a function el nombre de una funcion, nosregresara el objeto asociado a ese nombre.

I Como quote, function es un operador especial, ası queno necesitamos proteger su argumento. Ej.

1 > (function +)2 #<Compiled-Function + 17BA4E>

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Representacion interna de funciones

I Este extrano valor corresponde a la forma en que unafuncion serıa desplegada en una implementacion Lisp.

I Hasta ahora, hemos trabajado con objetos que lucen igualcuando los escribimos y cuando Lisp los evalua.

I Esto no suecede con las funciones, cuya representacioninterna corresponde mas a un segmento de codigomaquina, que a la forma como la definimos.

I La mejor referencia a las tripas de Lisp es [5].

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Abreviar function

I Al igual que usamos ’ para abreviar quote, podemosusar #’, para abreviar function.

1 > #’+2 #<Compiled-Function + 17BA4E>

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Funciones como argumentos

I Como sucede con otros objetos, en Lisp podemos pasarfunciones como argumentos. Una funcion que toma unafuncion como argumento es apply. Ej.

1 > (apply #’+ ’(1 2 3))2 63 > (+ 1 2 3)4 6

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Apply

I Se le puede dar cualquier numero de argumentos, si serespeta que el ultimo de ellos sea una lista. Ej.

1 > (apply #’+ 1 2 ’(3 4 5))2 15

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Funcall

I La funcion funcall hace lo mismo, pero no necesita quesus argumentos esten empaquetados en forma de lista. Ej.

1 > (funcall #’+ 1 2 3)2 6

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Funciones anonimas

I Para referirnos literalmente a un entero usamos unasecuencia de dıgitos; para referirnos literalmente a unafuncion usamos una expresion lambda cuyo primerelemento es el sımbolo lambda, seguido de una lista deparametros y el cuerpo de la funcion. Ej.

1 > (lambda (x y)2 (x + y))

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Aplicacion de una funcion anonima

I Una expresion lambda puede considerarse como elnombre de una funcion. Ej. Puede ser el primer elementode una llamada de funcion:

1 > ((lambda (x) (+ x 100)) 1)2 101

I o usarse con funcall:

1 > (funcall #’(lambda (x) (+ x 100)) 1)2 101

I Entre otras cosas, esta notacion nos permite usarfunciones sin necesidad de nombrarlas.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Mapcar

I Mapcar aplica una funcion a los elementos de una lista.

1 > (mapcar #’(lambda (x) (* x x))2 ’(1 2 3 4))3 (1 4 9 16)

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Tipificacion manifiesta

I Lisp utiliza un inusual enfoque flexible sobre tipos.I En muchos lenguajes, las variables tienen un tipo asociado

y no es posible usar una variable sin especificar su tipo.I En Lisp, los valores tienen un tipo, no las variables.I Imaginen que cada objeto en Lisp tiene asociada una

etiqueta que especifica su tipo.I Este enfoque se conoce como tipificacion manifiesta. No

es necesario declarar el tipo de una variable porquecualquier variable puede recibir cualquier objeto decualquier tipo.

I De cualquier forma, es posible definir el tipo de unavariable para optimizar el codigo antes de lacompilacion.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Jerarquıa de tipos

I Lisp incluye una jerarquıa predefinida de subtipos ysupertipos.

I Un objeto siempre tiene mas de un tipo. Ej. el numero 27es de tipo fixnum, integer, rational, real, number,atom y t, en orden de generalidad incremental. El tipo tes el supertipo de todo tipo en Lisp.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Typep

I La funcion typep toma como argumentos un objeto y unespecificador de tipo y regreta t si el objeto es de ese tipo.Ej.

1 > (typep 27 ’integer)2 T

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Ideas grandes

I Aunque este documento presenta un bosquejo rapido deLisp, es posible apreciar ya el retrato de un lenguaje deprogramacion inusual.

I Un lenguaje con una sola sintaxis para expresarprogramas y datos.

I Esta sintaxis se basa en listas, que son a su vez objetosen Lisp.

I Las funciones, que son objetos del lenguaje tambien, seexpresan como listas.

I Y Lisp mismo es un programa Lisp, programado casi porcompleto con funciones Lisp que en nada difieren alas que podemos definir.

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

A practicar

I No debe preocuparles que la relacion entre todas estasideas no sea del todo clara.

I Lisp introduce tal cantidad de conceptos nuevos que tomatiempo acostumbrarse a ellos y como usarlos.

I Solo una cosa debe quedar clara: Lisp fue creado parahacer Inteligencia Artificial [4]

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Para concluir

I Si C es el lenguaje para escribir UNIX (Richard Gabriel),entonces podrıamos describir a Lisp como el lenguaje paraescribir Lisp, pero eso es una historia totalmente diferente.

I Un lenguaje que puede ser escrito en si mismo, es algodistinto de un lenguaje para escribir una clase partıcularde aplicaciones.

I Ofrece una nueva forma de programar: ası como esposible escribir un programa en el lenguaje, ¡el lenguajepuede mejorarse para acomodarse al programa!

I Un compendio de aplicaciones “contemporaneas” deLisp se puede ver en [6].

Evaluar Listas Control Funciones Aspectos no funcionales Funcional Iteracion Mas Funciones

Bibliografıa

P. Graham.On Lisp: Advanced Techniques for Common Lisp.Prentice Hall International, 1993.

P. Graham.ANSI Common Lisp.Prentice Hall Series in Artificial Intelligence. Prentice Hall International, 1996.

G. Kiczales, J. des Rivieres, and D. G. Bobrow.The Art of Metaobject Protocol.The MIT Press, Cambridge, MA., USA, 1991.

P. Norvig.Paradigs of Artificial Intelligence Programming: Case Studies in Common Lisp.Morgan Kauffman Publishers, 1992.

C. Queinnec.Lisp in Small Pieces.Cambridge University Press, Cambridge, UK, 1996.

P. Seibel.Practical Common Lisp.Apress, USA, 2005.


Recommended