Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
LENGUAGE COMMON
LISP
IIIA 2005-2006
Introduction
IIIA
TAPIA 2005-2006 2
Introduccin
IIIA
Bibliografia bsica:
www.lispworks.com
www.franz.com CLOS (Object System)
www.digitool.com CLIM (Interface Manager)
TAPIA 2005-2006 3
TAPIA 2005-2006 4
Symbolic Computation
IIIA
Las reglas lxicas son mucho ms simples en LISP. Solo hay parntesis,
comillas (sencilla, doble y backquote) espacios y comas. El punto y coma
no separa expresiones (no es necesario debido a los parntesis) sino que
inicia comentarios.
TAPIA 2005-2006 5
Symbolic Computation
IIIA
> '(+ 2 2) (+ 2 2)
> (+ 2 2) 4
> A Error: A is not a bound variable
> (Carlos 'Antonio) Error: Carlos is not a function
Los clculos simblicos y numricos se pueden mezclar.
> (+ 2 (length '(a b c d))) 6
TAPIA 2005-2006 6
Variables
IIIA
Los smbolos se utilizan para dar nombre a las variables. Una variable
puede tomar como valor cualquier objeto LISP.
TAPIA 2005-2006 7
Special forms
IIIA
(setf x (+ 1 2) )
TAPIA 2005-2006 8
Listas
IIIA
Dado que las listas son esenciales en LISP, veremos unas cuantas funciones de
procesado de listas.
> p (esto es una asignacion)
> (first p) esto ; equivalente a (car p)
> (second p) es ; equivalente a (cadr p)
> (third p) una ; equivalente a (caddr p), etc.
> (fifth p) nil
> (length p) 4
Algunos detalles sobre listas. rest (o cdr) devuelve la lista resultante de
eliminar el primer elemento de la lista argumento. NIL y () son completamente
equivalentes. NIL tambin se utiliza para representar el valor falso.
Las listas pueden contener sublistas como elementos.
> (setf x '((una sublista) 2 (tercero) ((4)) 5)) ((una sublista) 2 (tercero) ((4)) 5))
> (first x) (una sublista) > (second x) 2
> (third x) (tercero) > (fourth x) ((4))
> (second (first x)) sublista
TAPIA 2005-2006 9
Listas
IIIA
TAPIA 2005-2006 10
Bases listas
IIIA
TAPIA 2005-2006 11
Funciones
IIIA
TAPIA 2005-2006 12
Funciones
IIIA
TAPIA 2005-2006 13
Utilizando funciones
IIIA
Trace
IIIA
TAPIA 2005-2006 16
Funciones High-order
IIIA
TAPIA 2005-2006 17
funcall es similar a apply con la diferencia sus argumentos no estan en una lista.
> (funcall #'+ 2 3) 5
> (apply #"+ '(2 3)) 5
> (funcall #'+ '(2 3)) Error (2 3) is not a number
Es posible definir funciones sin darles nombre. Esto se hace con la sintaxis
especial Lambda.
Russell x(x + x)
Church ^x(x + x) x(x + x) x(x + x) 1941
McCarthy (lambda (x) (+ x x)) 1958
TAPIA 2005-2006 18
Ms
IIIA
Hay dos razones que justifican la existencia de funciones lambda (sin nombre)
Provoca confusin crear nombres innecesarios de funciones en un programa.
Nos permite crear funciones en tiempo de ejecucin! Esta herramienta de
programacin es muy potente y no es posible usarla en la mayoria de lenguajes.
Estas funciones de tiempo de ejecucin se denominan clausuras o cierres.
TAPIA 2005-2006 19
Soporte de listas
Tipaje dinmico
Sintaxis uniforme
Entorno interactivo
Extensibilidad
Historia
TAPIA 2005-2006 20
LISP style
IIIA
Ser especfico
Ejemplo: When y if
Usar abstracciones
Ejemplo: last-name y caddar
Ser conciso
Ejemplo: find y loop
Usar las herramientas proporcionadas
Ejemplo: find
No ser oscuro
Ejemplo: otra vez find
Ser consistente
Ejemplo: usar siempre la misma primitiva para lo mismo
TAPIA 2005-2006 21
Funciones
(defun function-name (parameter ...) "opt. doc." body...)
Macros
(defmacro macro-name (parameter ...) "opt. doc." body ...)
Variables
(defvar variable-name initial-value "opt. doc.")
La expresin initial-value es evaluada slo si la variable no tiene valor
cuando se le requiere. Es opcional.
Parmetros
(defparameter variable-name value "opt. doc.")
Constantes
(defconstant variable-name value "opt. doc.")
Estructuras
(defstruct structure-name "opt. doc." slot...)
Todas las formas def- definen smbolos globales. Para definir variables
y funciones locales es necesario utilizar let y labels.
TAPIA 2005-2006 22
Estructuras
IIIA
Hemos visto el if. Ahora veremos el cond y como las demas pueden expresarse
como estas
(cond (test result...)
(test result...)
...)
Evaluacin secuencial de los tests, cuando uno evalua diferente de nil se evalua
el (los) resultados a continuacin. Si ninguno evalua no-nil el resultado es nil. Se
devuelve el resultado de la ltima expresin evaluada.
(when test a b c)
(or a b c)
(if test (progn a b c))
(cond (test a b c)) (if a a (if b b c))
(unless test x y) (cond (a) (b) (c))
(if (not test) (progn x y)) (case a (b c) (t x))
(cond ((not test) x y)) (if (eql a 'b) c x)
(and a b c)
(cond ((eql a 'b) c) (t x))
(if a (if b c))
(cond (a (cond (b c))))
TAPIA 2005-2006 24
Special forms para manejar variables y
IIIA
posiciones
La forma especial setf es la utilizada para assignar valores a una variable o a una
posicin (variable generalizada).
LISP PASCAL
(setf x 0) x := 0;
(setf (aref A i j) 0) A[i,j] := 0;
(setf (rest list) nil) list^.rest := nil;
(setf (name-middle b) 'Q) b^.middle := "Q";
Las expresiones que se pueden encontrar a la izquierda de una sentencia de
asignacin en Pascal estn limitadas por la sintaxis de Pascal, en LISP es posible
definir nuevas expresiones a travs de las forma especial defsetf.
Hay otras formas especiales ms espcificas. Por ejemplo (rplacd list nil) tiene el
mismo efecto que (setf (rest list) nil)
Para asignar variables es muy comn el uso de setq.
En cualquier caso la programacin funcional pura no permite la asignacin, y no es
extrao ver programas en los que esta no aparece. La forma habitual es el uso
de la vinculacin en lugar de la asignacin. Es decir usar parmetros de funciones
o variables locales dentro de un let.
(let ((x 40) ((lambda (x y)
(y (+ 1 1))) (+ x y))
(+ x y)) 40 (+ 1 1))
TAPIA 2005-2006 25
mapc tiene dos argumentos, uno una funcin y el otro una lista. Aplica la
funcin a cada elemento de la lista.
TAPIA 2005-2006 27
TAPIA 2005-2006 28
IIIA
TAPIA 2005-2006 29
TAPIA 2005-2006 31
Las versiones recursivas sobre listas son fciles de ver debido a la definicin
recursiva de las mismas. Una lista es o bien vacia o bien un elemento
concatenado a una lista.
Los rboles son difciles de manejar si no es a travs de recursin.
La ineficiencia es una objecin clsica a la recursin. Vease
TAPIA 2005-2006 33
(labels
((function-name (parameter...) function-body...) ...)
body-of-labels)
TAPIA 2005-2006 34
Otras formas especiales
IIIA
Hay otras formas especiales que no encajan en los tipos anteriores hemos visto
ya 'x (quote x) y #'f (function f)
IIIA
TAPIA 2005-2006 36
Macros
IIIA
Muchas de las formas especiales que hemos comentado no son tales formas. Son
macros que el compilador expande en tiempo de compilacin. LISP proporciona un
conjunto de macros predefinidas y permite al usuario definir nuevas macros. Las
macros se definen con la foma especial defmacro. Para construir una macro hay
que plantearse varias cosas:
Es necesaria la macro?
Escribir la sintaxis de la macro.
Imaginar en que debe expandirse la macro.
Escribir el cdigo de la macro usando defmacro.
Para la macro while una sintaxis puede ser
(while test body...)
la expansin ser (loop (unless test (return nil)) body...)
la definicin es
(defmacro while (test &rest body)
(list* 'loop
(list 'unless test '(return nil))
body))
TAPIA 2005-2006 37
Macros
IIIA
> (setf i 7) 7
> (while (< i 10)
(print (* i i))
(setf (+ i 1)))
49
64
81
nil
TAPIA 2005-2006 38
Notacin backquote
IIIA
Al final de una lista ",@" tiene el mismo efecto que "." seguido de ",".
TAPIA 2005-2006 39
TAPIA 2005-2006 41
IIIA
TAPIA 2005-2006 42
Igualdad y representacin interna
IIIA
uno Dos
(cons 'cero x) x
TAPIA 2005-2006 y 43
'x 'x T T T T
'0 '0 ? T T T
'(X) '(X) NIL NIL T T
'"XY" '"XY" NIL NIL T T
'"xY" '"Xy" NIL NIL NIL T
'0 '0.0 NIL NIL NIL T
'0 '1 NIL NIL NIL NIL
TAPIA 2005-2006 44
Funciones sobre secuencias
IIIA
(nth n list)
(elt sequence n)
(aref array n)
(char string n)
(bit bitvector n)
(sbit simplebitvector n)
(svref simplevector n)
TAPIA 2005-2006 45
Las listas de asociacin son listas utilizadas para implantar tablas. Una
lista de asociacin es una lista de pares puntuales donde cada par es del
tipo (clave . valor). Dada una clave se puede obtener el valor de la tabla.
> (setf state-table '((AL . Alabama) (AK . Alaska) (AZ . Arizona)))
> (assoc 'ak state-table) (AK . Alaska)
> (cdr (assoc 'ak state-table)) Alaska
> (assoc 'tx state-table) nil
Tambin se puede acceder por valor
> (rassoc 'arizona state-table) (AZ . Arizona)
> (car (rassoc 'arizona state-table)) AZ
Las tablas hechas con listas de asociacin se manejan de forma simple,
pero son ineficientes. LISP da la posibilidad de definir tablas de hash.
> (setf table (make-hash-table))
> (setf (gethash 'AL table) 'Alabama)
> (setf (gethash 'AK table) 'Alaska)
> (setf (gethash 'AZ table) 'Arizona)
TAPIA 2005-2006 46
Funciones sobre tablas
IIIA
La funcin remhash borra una pareja clave/valor de una tabla, clrhash las borra
todas y maphash se puede usar para recorrer todas las parejas.
Smbolos
IIIA
o symbol-value
o symbol-function
o symbol-plist
o symbol-name
o symbol-package
o symbolp
o inspect
ocompile
TAPIA 2005-2006 48
Funciones sobre arboles
IIIA
Funciones numricas
IIIA
(+ 4 2) 6 suma
(- 4 2) 2 resta
(* 4 2) 8 multiplicacin
(/ 4 2) 2 divisin
(> 100 99) T mayor que (tambin >=)
(= 100 100) T igual que (tambin /=)
(< 99 100) T menor que (tambin <=)
(random 100) 42 nmeros enteros aleatorios
(expt 4 2) 16 exponenciacin (tambien exp, y log)
(sin pi) 0.0 seno (tambin cos, tan, ...)
(asin 0) 0.0 arcoseno (tambin acos, atan, etc)
TAPIA 2005-2006 50
IIIA
TAPIA 2005-2006 51
Uno de los usos de LISP es tratar las listas como conjuntos. Para ello
proporciona un conjunto de funciones. Usaremos los siguientes valores
(intersection r s) (c d) interseccin
(union r s) (c d) unin
(set-difference r s) (a b) r-s
(member 'd r) (d) ver si el elem. perten. al conj.
(subsetp s r) nil ver si es subconjunto
(adjoin 'b s) (b c d e) aadir un elemento a un conj.
(adjoin 'c s) (c d e) pero sin duplicar
Ordenacin
IIIA
o Ordenacin de secuencias
o destructiva
o (sort (3 4 6 1 78 3 7) #<)
o (sort gadeedpkmk #'char-lessp)
o (sort '("Josep" "Ramon" "Laura" "Joan") #'string-lessp)
o (sort ((3 2 4) (4 ji true) (32 4 5) (9 8 7)) #'> :key #'car)
TAPIA 2005-2006 54
Entrada/salida
IIIA
IIIA
TAPIA 2005-2006 56
Herramientas de depuracin
IIIA
En LISP hay una tercera que es (3) hacer anotaciones que no son parte del
programa pero que automticamente alteran la ejecucin del mismo.
Este es el caso de trace y untrace que ya hemos visto. Otro caso es step. (step
expression). Evalua la expresin dando informacin de cada paso de evaluacin.
TAPIA 2005-2006 57
Valores mltiples
IIIA
Steele Jr., Guy L : CommonLISP the language second edition. Digital Press.
o Multiprocessing
o Compiler
o Delivery
o Debugger
o
TAPIA 2005-2006 59