PROGRAMACIÓN FUNCIONAL-todoparaalumnos

download PROGRAMACIÓN FUNCIONAL-todoparaalumnos

of 86

Transcript of PROGRAMACIÓN FUNCIONAL-todoparaalumnos

PROGRAMACIN FUNCIONAL: LISP

Dra. Nancy G. Arana Daniel, CUCEI, UdG

1

Programacin funcional. Los programas escritos en un lenguaje funcional estn constituidos

nicamente por definiciones de funciones, entendiendo stas no como subprogramas clsicos de un lenguaje imperativo, sino como funciones puramente matemticas, en las que se verifican ciertas propiedades como: la transparencia referencial (el significado de una expresin depende nicamente del significado de sus subexpresiones, por lo que una funcin puede ser reemplazada por su valor), y por tanto, la carencia total de efectos laterales. En ciencias de la computacin se dice que una funcin o expresin tiene efecto colateral o efecto secundario si sta, adems de retornar un valor, modifica el estado de su entorno

Otras caractersticas propias de estos lenguajes son la no existencia de asignaciones de variables y la falta de construcciones estructuradas como la secuencia o la iteracin (lo que obliga en la prctica a que todas las repeticiones de instrucciones se lleven a cabo por medio de funciones recursivas).

Dra. Nancy G. Arana Daniel, CUCEI, UdG

2

Existen dos grandes categoras de lenguajes funcionales: los funcionales puros y los hbridos. La diferencia entre ambos estriba en que los lenguajes funcionales hbridos son menos dogmticos que los puros, al admitir conceptos tomados de los lenguajes imperativos, como las secuencias de instrucciones o la asignacin de variables (LISP, Scala, Scheme, Ocaml, SAP y Standard ML ).

En contraste, los lenguajes funcionales puros tienen una mayor potencia expresiva, conservando a la vez su transparencia referencial, algo que no se cumple siempre con un lenguaje funcional hbrido. (Haskell y Miranda )

Dra. Nancy G. Arana Daniel, CUCEI, UdG

3

Orgenes de LISP. Creado en 1956 por John McCarthy (investigador en Inteligencia Artificial). Propsito inicial: procesamiento simblico de datos. LISP = LISt Processing. En los 80 fue la poca de oro de Lisp (surgi el estndar Common Lisp en 1984, ANSI en 1996). Aplicaciones actuales programadas en Lisp: Emacs, Yahoo Store, etc. (Ms aplicaciones en http://common-lisp.net.)Dra. Nancy G. Arana Daniel, CUCEI, UdG 6

Paul Graham On Lisp. Prentice Hall. 1993. Disponible en http://www.paulgraham.com/onlisp.html. Guy Steele Common Lisp. The Language. Segunda edicin. Digital Press. 1990. Disponible enhttp://www.cs.cmu.edu/Groups/AI/html/cltl/cltl2.html.Dra. Nancy G. Arana Daniel, CUCEI, UdG 7

Existen varias distribuciones actuales. El curso se basa en Lisp works usando Common LISP. Puede obtenerse de http://www.lispworks.com/ Una alternativa es Lisp in a Box usando mdulo CLISP. Puede obtenerse de http://common-lisp.net/project/lispbox/

Actividad prctica: Instalar Lisp works o Lisp in a Box.

Dra. Nancy G. Arana Daniel, CUCEI, UdG

8

Tipos de datos en LISP Las dos clases de datos ms importantes en Lisp son: tomos Smbolos Representados por secuencias de caracteres de longitud razonable (nombres de variables y funciones). Ej nlados Nmeros. Ej 1.4142 Constantes. Ej pi, t, nil

Listas. Construdas recursivamente por tomos. Esto significa que una lista puede contener tanto tomos u otras listas como miembros.

Ambas clases son mutuamente excluyentes, con excepcin de la entidad especial, la lista vaca conocida como ``()'' o ``nil,' la cual pertenece a ambas clases.

Dra. Nancy G. Arana Daniel, CUCEI, UdG

9

Ejemplos SMBOLOS a john 34 c3po LISTAS () (a) (a john 34 c3po) ((john 34) a ((c3po)))

*Nota importante: Lisp no es sensible al caso!.Dra. Nancy G. Arana Daniel, CUCEI, UdG 10

tomos: nmeros. Enteros. Ej. 4 Fracciones. Ej. 1/5 Reales. Ej. 1.4142135 Complejos. Ej. #C(2 3)Dra. Nancy G. Arana Daniel, CUCEI, UdG 11

Nmeros enteros en Lisp Los decimales se expresan normalmente. Ej. -128 En otra base toman la forma #nnrddddd #nnRddddd. nn es la base. Ej. 2, 16, 25. Abreviaturas para binario (#b para #2r), hexadecimal (#x para #16r) y octal (#o para #8r). Pueden ser arbitrariamente largos.

k

Dra. Nancy G. Arana Daniel, CUCEI, UdG

12

Nmeros fraccionarios en Lisp Se expresan como un cociente de la forma #nnrddddd/ddddd No se reducen a nmeros reales. Junto con los enteros forman el tipo de dato rational.

Dra. Nancy G. Arana Daniel, CUCEI, UdG

13

Evaluacin de tomos Para cada tomo, el intrprete LISP lo evala encontrando su valor. Para la mayora de los tomos el evaluador regresar un error a menos que se le asigne previamente un valor. Ej. CL-USER 2 > atomo Error: The variable ATOMO is unbound. Se pueden asignar valores a los smbolo usando setq Ej CL-USER 1 > (setq horas-por-dia 24) 24 *Nota: setq puede tomar un nmero arbitrario de pares de smbolos valores: ahora si tenemos variables para reasignar valores!!!!.Dra. Nancy G. Arana Daniel, CUCEI, UdG 14

Evaluacin de tomos. Una vez asignado un valor a un tomo, se podr probar CL-USER 3 : 1 > horas-por-dia 24 Los tomos especiales que no necesitan que se les asigne previamente un valor para ser correctamente evaluados son Nmeros. Se predefine que su evaluacin (valor) sea ellos mismos CL-USER 4 : 1 > 9 9 CL-USER 5 : 1 > 3.5 3.5 CL-USER 6 : 1 > #C(2 3) #C(2 3)

Dra. Nancy G. Arana Daniel, CUCEI, UdG

15

Evaluacin de tomos. Adems de los nmeros, existen otros dos tomos especiales, para los cuales su valor est predefinida, t y nil (verdadero y falso respectivamente). El intrprete considera nil como el valor idntico a la lista vaca. CL-USER 7 : 1 > t T CL-USER 8 : 1 > () NIL CL-USER 9 : 1 > nil NILDra. Nancy G. Arana Daniel, CUCEI, UdG 16

Qu pasa? Si intentamos realizar las siguientes asignaciones de valor. > (setq 1 2) Error: 1 is not a symbol. Error signalled by SETQ. > (setq t nil) Error: Cannot assign to the constant T. Error signalled by SETQ.Dra. Nancy G. Arana Daniel, CUCEI, UdG 17

Listas. Cuando el intrprete Lisp encuentra una lista, asume que es de la forma (funcin arg1 arg2 ...) Todas las funciones debern estar previamente definidas antes de ser usadas. > ( sqrt (+ (* x x) (* y y))) 4.472136 > (abs #C(3 4)) 5.0 >(+ 3 4 5) 12Algunas primitivas (funciones pre;(x^2+y^2) ^0.5 definidas en Lisp): +, -, *, /, exp, expt, log, ;raz cuadradacos, tan, max, min. de C sqrt, sin, del determinante *busquen ms primitivas en la Bibliografa y prubenlas.

Dra. Nancy G. Arana Daniel, CUCEI, UdG

18

Se evala de izquierda a derecha buscando la sintxis (funcin, parmetro1,,parmetron)

Orden de evaluacin de listas

Todos los parmetros se evalan uno a uno tambin de izquierda a derecha. Por ejemplo.en qu nivel dara el error la De izquierda a siguiente consulta: derecha! Y no de anidamiento ms >(cons a (cons b nil)) profundo a menos Error: La variable A is unbound. profundo.Dra. Nancy G. Arana Daniel, CUCEI, UdG 19

Construccin de listas, funciones bsicas de lisp cons permite agregar un elemento al inicio de una lista. list crea una lista a partir de sus elementos. append concatena listas.

Dra. Nancy G. Arana Daniel, CUCEI, UdG

20

Construccin de listas: cons La primitiva cons permite aadir un miembro al frente de la lista y consta de dos parmetros, ejemplos: >(cons 1 nil) ;1 y nil son tomos pre-evaluados (1) > (cons 1 (cons 2 nil)) (1 2)Se evaluara como 2, Y se convierte en el 2 parmetro de (cons 1)

Dra. Nancy G. Arana Daniel, CUCEI, UdG

21

Supongan que se quiere construir la lista (1 b c d e) Cuando el intrprete llega a evaluar > (cons 1 (b c d e))Error: Undefined operator B in form (B C D). El segundo parmetro, se da cuenta de que se trata de una lista, pero el primer trmino de ella NO ES UNA FUNCIN!

Solucin: Con un apstrofe al frente del trmino que no deseamos que el intrprete evale! > (cons 1 (b c d e)) (1 B C D E) y si cambiamos el 1 por a? >(cons a (b c d e)) >(cons a (b c d e))Error: The variable A is unbound.

(A B C D E)

Noten que (setq algo 1) no necesita apstrofe al frente del smbolo algo, porque setq sustituye al antiguo >(set (quote a) 4).Dra. Nancy G. Arana Daniel, CUCEI, UdG 22

Quote > (quote (a b c)) (a b c) > (a b c) (a b c) En los ltimos dos ejemplos se hace uso de una funcin predeterminada de LISP llamada quote o simplemente . Esta funcin es especial en el sentido de que evita la evaluacin de su nico argumento y devuelve su argumento al evaluarse.

Dra. Nancy G. Arana Daniel, CUCEI, UdG

23

Cuando cons es usado con dos tomos o un tomo como segundo argumento, produce lo que se conoce como un par punto . Un par punto es la imagen externa de un nodo con una estructura interna con dos componentes llamados car (head) y cdr (tail) por razones histricas. Cada componente en los pares punto puede ser un tomo o una lista y es la representacin de lista en functores como lo hace prolog. De esta manera cada lista se representa internamente como un par punto (A) = (A.NIL). (A B) = (A.(B.NIL)). (A B C ) = (A.(B.(C.NIL)) ). (A B C D ... Y Z) = (A.(B.(C.(.D ... (Y. (Z. NIL)) ... ).

Dra. Nancy G. Arana Daniel, CUCEI, UdG

24

Construccin de listas: list La primitiva List toma todos sus argumentos y hace con ellos una lista con los argumentos como elementos. Los argumentos de list pueden ser tanto tomos como listas. > (list 2 3 4) (2 3 4) > (list 'a '(a s d f)) (a (a s d f))Dra. Nancy G. Arana Daniel, CUCEI, UdG 25

Construccin de listas: append Append se usa normalmente con listas como argumentos. Slo el ltimo argumento puede ser un tomo, lo que produce un par punto. Cuando es usado con listas append tiene el efecto de tomar todos los elementos de las listas que fungen como sus argumentos y crear una nueva lista con dichos elementos.

> (append '(a b) '(c d)) (a b c d)

Dra. Nancy G. Arana Daniel, CUCEI, UdG

26

Comprobar diferencias: cons, list, append> (cons '(1 2) '(3 4)) ((1 2) 3 4) > (list '(1 2) '(3 4)) ((1 2) (3 4)) > (append '(1 2) '(3 4)) (1 2 3 4)

Dra. Nancy G. Arana Daniel, CUCEI, UdG

27

first permite seleccionar el primer elemento de una lista (car). > (first '(a s d f)) a > (first '((a s) d f)) (a s) rest permite seleccionar todos los elementos excepto el primero (cdr). > (rest '(a s d f)) (s d f) > (rest '((a s) d f)) (d f) > (rest '((a s) (d f))) ((d f))

Selectores: first & rest.

Dra. Nancy G. Arana Daniel, CUCEI, UdG

28

> (setq a '(a s d f)) (a s d f) >(first a) a > (rest a) (s d f) > (first (rest a)) s * Ahora se imaginarn cmo llegar al tercer y cuarto elemento de una lista usando first y rest.Dra. Nancy G. Arana Daniel, CUCEI, UdG 29

Cambiando el valor de las variables!(setq a '(a s d f)) (a s d f) Qu pasa con el valor de a despus de evaluar la siguiente lista? > (cons 'a a) (a a s d f) >a >(a s d f) Los tomos sirven como variables a las cuales se les puede reasignar valores!!!!, no estn atadas a un unificador como en prolog. Si queremos que los cambios a la variable a sean permanentes: > (setq a (cons 'a a)) (a a s d f) >a (a a s d f)

Dra. Nancy G. Arana Daniel, CUCEI, UdG

30

de una lista, requiere un solo argumento: la lista en cuestin. >a (a a s d f) > (length '(1 2 3)) 3 > (length a) 5 > (length (append a a)) 10 > (length '(append a a)) 3 > (length (list a a)) 2Dra. Nancy G. Arana Daniel, CUCEI, UdG

Length nmero de elementos Length devuelve por evaluacin el

31

Predicados: atom y listp Los predicados son funciones que siempre regresan t o nil. Atom es un predicado que determina si su argumento es un tomo. Listp regresa t si su argumento es una lista y nil en caso contrario. > (atom 'a) T > (atom a) NIL > (listp 'a) NIL > (listp a) T >(atom ()) T >(listp ()) T

>a (a a s d f)

* Explique y ejemplifique los predicados Symbolp, numberp y constantp.

Dra. Nancy G. Arana Daniel, CUCEI, UdG

32

Tarea.

Dra. Nancy G. Arana Daniel, CUCEI, UdG

33

Setf. setf permite cambiar la parte seleccionada de una lista >( setq mi-lista ( Sara es mi nombre )) (SARA ES MI NOMBRE) >( setf ( first mi-lista ) Ana ) ANA >mi-lista (ANA ES MI NOMBRE) > (setf (third mi-lista) el) EL > mi-lista (ANA ES EL NOMBRE) > (setf (rest mi-lista) '(estudia mucho)) (ESTUDIA MUCHO) >mi-lista (ANA ESTUDIA MUCHO)Dra. Nancy G. Arana Daniel, CUCEI, UdG 34

Definicin de funciones: defun (funcional) Defun se usa para definir funciones en lisp. Requiere que se le provea lo siguiente: El nombre de la funcin (evitar redefinir funciones primitivas de lisp) La lista de parmetros (variables, no constantes*) El cuerpo de la funcin (las subexpresiones)

Sintxis:(defun )

*muchas versiones de lisp consideran a pi como constante que no puede ser reasignada, lispworks es uno de ellos! **defun se encarga como setf y setq de las apstrofes automticamente

Dra. Nancy G. Arana Daniel, CUCEI, UdG

35

Modificadores de argumentos de funcin Sintaxis: (defun ( ... &optional ... &rest ... &key ((: ) ... ) &aux ...) ) &optional Permite n variable de argumentos. Los argumentos listados a continuacin son opcionales y si no se especifican, se inicializan a NIL &rest Se asigna el resto de argumentos sobrantes &key Asigna clave a los argumentos, lo que permite suministrarlos en cualquier orden &aux Permite definir variables locales a la funcin

Dra. Nancy G. Arana Daniel, CUCEI, UdG

36

Ejemplos>(defun f (a1 a2 &optional a3 &rest a4) )>(f a b) a1=valor(a) a2=valor(b) a3=NIL a4=NIL >(f a b c) a1=valor(a) a2=valor(b) a3=valor(c) a4=NIL >(f a b c d e) a1=valor(a) a2=valor(b) a3=valor(c) a4=(valor(d) valor(e))

>(defun f (&key ((:clave1 a1)(:clave2 a2)(:clave3 a3))) ...) >(f :clave3 23 :clave2 (a b c)) a1=NIL a2=(a b c) a3=23

Dra. Nancy G. Arana Daniel, CUCEI, UdG

37

Definicin de funciones Las funciones pueden tener un nmero indefinido de expresiones en el cuerpo. El valor que retorna es el resultado de la ltima expresin.

Qu diferencias hay?Dra. Nancy G. Arana Daniel, CUCEI, UdG 38

Reglas de mbito de variables. Una variable global es la que se define fuera de cualquier funcin o se asigna su valor dentro de una funcin, pero no es un parmetro. Una variable local es aquella que se define dentro de una funcin como parmetro. Si dentro de una funcin se define una variable local con el mismo nombre de una global, se usa dentro de la funcin la variable local. Si dentro de una funcin se modifica una variable global sin que haya una local con el mismo nombre, el valor queda almacenado al salir de la funcin. **los buenos programadores de lisp usan variables locales en lugar de globales tantocomo se pueda

Dra. Nancy G. Arana Daniel, CUCEI, UdG

39

Qu mbito tiene la variable z? >(setq z 10 ) >(defun cuadrado (x) (* x x)) >(defun potencia4 (x) (cuadrado (cuadrado x))) >(defun potencia-de (x) (setq y (cuadrado x)) (potencia4 x) ) Qu mbito tiene la variable x? Qu mbito tiene la variable y?

Dra. Nancy G. Arana Daniel, CUCEI, UdG

40

PROCESAMIENTO DE LISTAS INSERCIN, OBTENCIN DE UN ELEMENTO, ELIMINACIN, BSQUEDA EN LISTAS. PONER EJEMPLOS

Dra. Nancy G. Arana Daniel, CUCEI, UdG

41

Insertar un elemento insert-at 'e '(a b c d f) 5 (A B C D E F) (defun i-at (elem org-list pos) (if (or (eql pos 1) (eql org-list nil)) (cons elem org-list) (cons (car org-list) (i-at elem (cdr org-list) (- pos 1)))))Dra. Nancy G. Arana Daniel, CUCEI, UdG 42

Remueve k-simo(defun r-at (org-list pos &optional (ini 1)) (if (eql pos ini) (cdr org-list) (cons (car org-list) (r-at (cdr org-list) pos (+ ini 1)))))

Dra. Nancy G. Arana Daniel, CUCEI, UdG

43

ltimo de la lista(defun ml (lista) (if (null lista) nil (if (null (rest lista)) lista ; tiene un elemento (ml (rest lista)) ; recursin en el resto lista ) ) )Dra. Nancy G. Arana Daniel, CUCEI, UdG 44

Algoritmos de ordenamiento de listas (TAREA) Merge Burbuja (y su mejora) Seleccin Insercin Quick sort

Dra. Nancy G. Arana Daniel, CUCEI, UdG

45

Funciona para expresar y evaluar si una funcin es computable o no (lo es si puede expresarse usando este formalismo). Enfatiza el uso de reglas de transformacin y no pone atencin en la mquina real en la que se implementen, lo que lo hace un enfoque ms relacionado al sw que al hw.

Clculo lambda

Dra. Nancy G. Arana Daniel, CUCEI, UdG

46

Es el principal concepto del clculo lambda. Y se define de manera recursiva como sigue::= | | := . := - Una expresin puede estar rodeada con parntesis por claridad, esto es, si E == (E). - Las nicas palabras clave en el clculo lambda son y el punto.Dra. Nancy G. Arana Daniel, CUCEI, UdG 47

Expresiones lambda

Funcin identidad := . x.x - El nombre despus de es el identificador del argumento de la funcin. La expresin despus del punto (en este caso x) es llamado el cuerpo de la definicin.

Ejemplos

Dra. Nancy G. Arana Daniel, CUCEI, UdG

48

Las funciones pueden ser aplicadas a expresiones. Un ejemplo de un aplicacin es := (x.x)y - Las aplicaciones de funciones son evaluadas sustituyendo el valor del argumento x, en el cuerpo de la funcin: (x.x)y=[y/x]x=y - La notacin [y/x] es usada para indicar que todas las ocurrencias de x son sustituidas por y en la expresin de la derecha.

Dra. Nancy G. Arana Daniel, CUCEI, UdG

49

Suponga que se tiene f(x)=x+1, y g(x)=x+2, tal que si llamamos f(g(x))= g(x)+1=x+2+1=x+3 En clculo lambda: (x.x+1)(x.x+2) Y si queremos evaluar a x=2 (x.x+1)(x.x+2)2 En CL: >((lambda (x) (+ x 1)) ((lambda (x) (+ x 2)) 2)) 5Dra. Nancy G. Arana Daniel, CUCEI, UdG 50

Funciones como parmetros

A tener en cuenta: Se pueden hacer dos observaciones tiles:1-Las funciones no necesitan un nombre especfico, es decir, pueden ser escritas en forma annima. x.x+1 Y se desea evaluar para x=2 (x.x+1)2 En CL usamos las funciones lambda como annimas ((lambda(x) (+ x 1)) 2) *la cual se evala a 3Dra. Nancy G. Arana Daniel, CUCEI, UdG 51

2.- Los nombres de los argumentos de funciones es igual de irrelevante que la de los nombres de las funciones. Esto es: (z.z) (x.x) (y.y) (lambda (x) x) POR LO TANTO, AL PRESCINDIR DE NOMBRES DE FUNCIONES Y/O VARIABLES HACEMOS LA OPERACIN CON FUNCIONES (a travs de funcionales aplicaciones-) LIBRE DE AMBIGEDADES (EJ. DECIDIR SI DOS FUNCIONES SON IGUALES).Dra. Nancy G. Arana Daniel, CUCEI, UdG 52

Para expresar una funcin f(x,y)= 3x+y2 sera escrita como (x,y).(3x+y2 ) Notacin lambda (lambda (x y) (+ (* 3 x) (* y y))) ;Lisp Como se puede observar, la sintxis de las expresiones lambda en Lisp son similares ala notacin de Church y an ms similares a la notacin de DEFUN. - Ojo: a diferencia de DEFUN, LAMBDA no es una

funcin!; es un marcador al cual EVAL le da un tratamiento especial.Dra. Nancy G. Arana Daniel, CUCEI, UdG 53

El trabajo de DEFUN es asociar nombres con funciones. Cuando tecleamos una nueva definicin de funcin, digamos HALF hay dos cosas a considerar: 1.- La cadena HALF representa un smbolo 2.- El smbolo HALF nombra la funcin.

El objeto que representa a la funcin contiene en la celda del nombre un puntero a la cadena HALF, mientras que la celda que apunta al objeto funcin contiene la funcin real, lo que indica que existir una expresin lambda en cada funcin,en algn lugar de memoria cuando se define dicha funcinDra. Nancy G. Arana Daniel, CUCEI, UdG 54

Una de las principales caractersticas de Lisp y de las ventajas de representar las funciones como expresiones lambda, es la de conceptualizar dichas funciones como DATOS u objetos de primera clase (por la funcin que realizan a su vez con datos pasivos: listas, estructuras, reales, etc). De esta manera las funciones son suceptibles de ser referenciadas, pasadas como parmetros, devueltas como valor de retorno de otras funciones.. en general operadasDra. Nancy G. Arana Daniel, CUCEI, UdG 55

Programacin de aplicaciones

Funcionales (Programacin aplicativa).Otra caracterstica del paradigma de programacin funcional es que las funciones son objetos de primera clase, adems de realizar una accin, pueden ser referenciados, operados y regresados por operadores llamados funcionales. En contraste, los lenguajes procedurales tradicionales , los objetos de primera clase son normalmente estructuras de datos pasivas, tales como nmeros, caracteres y cadenas. En un lenguaje funcional, la programacin impllica aplicar funcionales en varias formas en vez de manipular variables con asignaciones, ciclos, etc.

Dra. Nancy G. Arana Daniel, CUCEI, UdG

56

entrada regresar el primer elemento de la lista para el cual el predicado regresa TRUE (cualquier valor no-nil). >(find-if # oddp (2 4 6 7 8 9)) 7 >(find-if # (lambda (x) (> x 3)) (0 2 4 5 6)) 4 - Si no existe elemento que satisfaga el predicado se regresar nil >(find-if # oddp (2 4 6 8)) nilDra. Nancy G. Arana Daniel, CUCEI, UdG 57

Operador de aplicacin (funcional):Find-if Si se le proporciona un predicado y una lista como

Operador de aplicacin (funcionales) Remove-if Remove-if es otro funcional que toma un predicado como entrada y remueve todos los elementos de una lista que satisfacen el predicado, adems regresa una lista con lo que qued de la original.

> (remove-if #numberp (2 for 1 sale)) (FOR SALE) > (remove-if #oddp (1 2 3 4 5 6 7)) (2 4 6)Dra. Nancy G. Arana Daniel, CUCEI, UdG 58

Ejercicio. Supongan que queremos encontrar todos los elementos positivos de una lista de nmeros. Nos ayudaremos con el predicado plusp, el cual prueba si un nmero es mayor que cero. > (remove-if #(lambda (x) (not (plusp x))) (2 0 4 6 -8 10)) (2 6 10)

Dra. Nancy G. Arana Daniel, CUCEI, UdG

59

Remove-if-not Reduce Every

Dra. Nancy G. Arana Daniel, CUCEI, UdG

60

Formato: (eval ) Argumentos requeridos: 1 : Cualquier expresin Lisp eval provee acceso directo al evaluador de expresiones Lisp. Esto causa la evaluacin de lo que sea que regrese. Por lo tanto, si es una expresin evaluable, que a su vez regresa una expresin Lisp evaluable, entonces eval regresa el valor de la evaluacin de esta segunda expresin. Examples:> (eval (+ 3 4)) 7 > (eval '(+ 1 2)) 3 > (eval (cons '+ '(1 2))) 3 >(setq forma (cons + (1 2))) (CONS (QUOTE +) (QUOTE (1 2))) >(eval forma) (+ 1 2) > (eval 3) 3 > (eval (cons 'a '(s d f))) Error: The function A is undefined.Dra. Nancy G. Arana Daniel, CUCEI, UdG 61

Operador de aplicacin (funcional) eval

Operadores relacionales

> (> 5 2 1 0) T (= a b) y (equal a b) son los ms usados Operadores de igualdad, pero existen otros Eq y eql investiguen su funcionamiento y Diferencias. > (> 2 1 10 ) NIL > (> 5 1 4) NIL * Las evaluaciones se realizan por pares.Dra. Nancy G. Arana Daniel, CUCEI, UdG 62

Los predicados null y not son equivalentes Ambos verifican si el operando es nil. Se prefiere null para verificar listas vacas y not en los restantes casos (por estilo de programacin).

Predicados null y not

> (null nil) T > (not nil) T > (null ()) T > (not ()) ;;usar null T

> (null '(a s)) NIL > (not '(a s)) ;;usar null NIL > (not (= 1 (* 1 1))) NIL > (null (= 1 (/ 1 1))) ;;usar not NIL

Dra. Nancy G. Arana Daniel, CUCEI, UdG

63

Operadoresorden en los que aparecen, pero slo los lgicos and y or. Ambos evalan sus argumentos en elsuficientes para proveer un resultado definitivo. And regresa NIL tan pronto encuentre un argumento que se evale con ese valor. De otra manera regresa el valor de su ltimo argumento.

> (and 1 2 3 4) 4 > (and 1 (cons 'a '(b)) (rest '(a)) (setf y 'hello)) NIL >y Error: The variable Y is unbound.

Dra. Nancy G. Arana Daniel, CUCEI, UdG

64

Or regresa el resultado de su primer argumento no-nil (por lo tanto, para el evaluador en ese punto). Regresa nil si todos los argumentos se evalan a nil> (or (rest '(a)) (equal 3 4)) NIL > (or nil nil 2 (setf y 'goodbye)) 2 >y Error: The variable Y is unbound.

Or

Dra. Nancy G. Arana Daniel, CUCEI, UdG

65

La estructura if nos permite ejecutar determinado cdigo en dependencia de determinada condicin (if ) La parte marcada con se ejecuta cuando da T o cualquier otro valor distinto de NIL. Cuando da NIL se ejecuta . , y pueden ser cualquier expresin evaluable de lisp.

Control condicional: if

Qu regresa el evaluador de lisp con ?

>absdiff(3 4) 1 >absdiff(5 3) 2Dra. Nancy G. Arana Daniel, CUCEI, UdG 66

cond es el equivalente al switch de otros lenguajes.

Control condicional: cond

A cada uno de los ( ... ) se le llama clusula. Slo la parte es requerida, pero generalmente contienen y , ste ltimo sera el valor que regresa el evaluador si la parte resulta en un valor diferente de NIL, por lo tanto los intermedios se usan para producir efectos secundarios en los cond. El test de la ltima clusula es generalmente t. (defun absdiff (x y) (cond ((> x y) (- x y)) (t (- y x))))

Dra. Nancy G. Arana Daniel, CUCEI, UdG

67

Las funciones recursivas son las que se llaman a s mismas.

Recursin e iteracin.

Dra. Nancy G. Arana Daniel, CUCEI, UdG

68

Desarrollen una funcin recursiva que calcule la potencia y de un nmero x

Dra. Nancy G. Arana Daniel, CUCEI, UdG

69

Qu hace la siguiente funcin recursiva?ns

ns ns

(+1 ) suma uno a su nico argumento y lo devuelve. (-1 ) decrementa su argumento en 1 y lo devuelve. >(setq a (a b c d e)) >(setq b (cons (ab) a)) >(ns a) 0 >(ns b) 1Dra. Nancy G. Arana Daniel, CUCEI, UdG 70

Depurando funciones recursivas con trace.> (power 2 4) 0 POWER > ... >> X : 2 >> Y : 4 1 POWER > ... >> X : 2 >> Y : 3 2 POWER > ... >> X : 2 >> Y : 2 3 POWER > ... >> X : 2 >> Y : 1 4 POWER > ... >> X : 2 >> Y : 0 4 POWER < ... (let ((temp 3) (let ((temp 3) (temp2 (- 67 34))) (temp2 (- 67 34)))) (* temp temp2)) NIL 99

Dra. Nancy G. Arana Daniel, CUCEI, UdG

74

Variables locales con asignacin secuencial: let* Mientras que let ejecuta en paralelo las asignaciones de valores a toda la lista de variables que proporcionemos. Let* realiza dichas asignaciones secuencialmente.>(let ((temp 3) (temp2 temp)) (* temp temp2)) Error: The variable TEMP2 is unbound. >(let* ((temp 3) (temp2 temp)) (* temp temp2)) 9

Dra. Nancy G. Arana Daniel, CUCEI, UdG

75

Iteracin usando dolist(dolist ( ) )

prox-elem va iterando sobre la lista. Su valor cambia segn el nmero de iteracin. resultado es opcional. Se evala y es retornado por dolist al finalizar las iteraciones. En cada iteracin se evalan las expresiones en el cuerpo.Dra. Nancy G. Arana Daniel, CUCEI, UdG 76

(defun nsl-i (lis) (let ((result 0)) (dolist (next lis result) (if (listp next) (setf result (1+ result)))))) >(nsl-i-i (a b c (d e) f (g))) 2 >(dolist (c (a b c d) 3)(print c)) A B C D 3

Ejemplo dolist

Dra. Nancy G. Arana Daniel, CUCEI, UdG

77

Detener y reiniciar la evaluacin de lisp. El operador apstrofe () se utiliza para detener la evaluacin. Ej. (1 2 3) El operador acento grave (`) tambin detiene la evaluacin pero puede activarla para elementos que comiencen con una coma (,). Ver tambin ,@. >` (1 2 ,(+3 5) 6) (1 2 8 6) ;lo que equivale a > (list 1 2 (+ 3 5)6)Dra. Nancy G. Arana Daniel, CUCEI, UdG 78

Cundo usar recursin y cundo usar iteracin. Tres factores a considerar para tomar la decisin: (1) Las funciones iterativas son normalmente ms rpidas que sus contrapartes recursivas. As que si la velocidad de procesamiento es un objetivo primordial en el programa, la opcin recomendable es la iteracin. (2) Si el lmite en la pila es una restriccin tambin se preferira la iteracin. (3) Algunos procedimientos de hecho se definen formalmente, en el marco terico de donde provienen, de manera inductiva o por medio de anidamientos de estructuras, en este caso, la eleccin ser claramente la recursin.Dra. Nancy G. Arana Daniel, CUCEI, UdG 79

Mejorando la eficiencia de una funcin recursiva: tail-recursion. Para que una funcin sea tail-recursive, la respuesta que se regresa en el primer nivel de recursin a la funcin, debe ser idntica al valor regresado en el ltimo nivel de recursin. Por lo tanto el valor regresado por la ltima llamada recursiva es el valor que regresa la funcin. Ejemplos (factorial 3)0 FACTORIAL > ... >> X : 3 1 FACTORIAL > ... >> X : 2 2 FACTORIAL > ... >> X : 1 3 FACTORIAL > ... >> X : 0 3 FACTORIAL < ...