Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Curso 20092010
Tema 1: Introducci
on a Lisp
Jos
e Antonio Alonso Jim
enez
Francisco Jes
us Martn Mateos
Jos
e L. Ruiz Reina
Universidad de Sevilla
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.1
Introducci
on a Lisp
x
LISt Processing
u
Lenguaje interpretado
u
Compilador
Hist
oricamente, uno de los lenguajes de la Inteligencia Artificial
u
Lambda c
alculo
Procesamiento simb
olico
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.2
Introducci
on a Lisp
x
Prototipado R
apido
Eficiencia
Paradigma de programaci
on funcional
u
Un lenguaje de programaci
on flexible
u
Lenguaje de programaci
on programable
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.3
Una sesi
on con Lisp
x
Arrancar un int
erprete: clisp
Interactuar con
el:
u
El int
erprete de Lisp reconoce la expresi
on como la representaci
on escrita de un
objeto Lisp.
El int
erprete elige una representaci
on escrita del valor obtenido.
El int
erprete escribe dicha representaci
on.
Cerrar el int
erprete: (exit)
Compilaci
on: compile-file
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.4
Introducci
on a Lisp
x
Expresiones
> 1
1
> (+ 2 3)
5
> (+ (- 5 2) (* 3 3))
12
Primeras observaciones:
u
Notaci
on prefija: funci
on y argumentos. Par
entesis. Expresiones anidadas
Atomos y listas
Sint
acticamente simple
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.5
Introducci
on a Lisp
x
Evaluaci
on
> (+ (- 5 2) (* 3 3))
12
Regla de evaluaci
on (b
asica)
u
Evaluaci
on de los argumentos
De izquierda a derecha
Todo se eval
ua
u
Se ver
an m
as adelante
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.6
Introducci
on a Lisp
x
La funci
on quote:
> (quote (+ (- 5 2) (* 3 3)))
(+ (- 5 2) (* 3 3))
> (+ (- 5 2) (* 3 3))
(+ (- 5 2) (* 3 3))
Otro ejemplo:
> x
*** - EVAL: variable X has no value
1. Break> abort
> x
X
> (esto (es) (una lista))
*** - EVAL: undefined function ESTO
1. Break> abort
> (esto (es) (una lista))
(ESTO (ES) (UNA LISTA))
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.7
Introducci
on a Lisp
x
Salida: funci
on format
> (format t "~a mas ~a igual a ~a. ~%" 2 3 (+ 2
2 mas 3 igual a 5.
NIL
3))
Entrada: funci
on read
> (defun pide (frase)
(format t "~a " frase)
(read))
PIDE
> (pide "Su edad, por favor:")
Su edad, por favor: 23
23
Algunas observaciones
u
Secuencialidad en programas
Efectos colaterales
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.8
Introducci
on a Lisp
x
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.9
Introducci
on a Lisp
x
El paradigma de la programaci
on funcional
Valores vs. Modificaciones
> (setf x (a b c d))
(A B C D)
> (remove b x)
(A C D)
> x
(A B C D)
La programaci
on sin efectos colaterales es preferible aunque no obligatoria
u
Verificaci
on formal
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.10
Tipos de datos b
asicos
x
At
omicos:
u
n
umeros: 27, 3.14, . . .
No at
omicos:
u
Cadenas: "Buenos d
as"
Estructuras:
#S(PERSONA :NOMBRE (ana maria) :ESTADO casado :CALLE (reina
mercedes) :CIUDAD sevilla)
Tablas hash
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.11
Pares y listas
x
Pares punteados:
u
Construtor: cons
1
x
Listas
u
Ejemplo: la lista (1 2 3)
nil
2
1
IA-I 20092010
Cc Ia
3
Introducci
on a Lisp
1.12
Funciones de construcci
on de listas
x
Funciones b
asicas de creaci
on
* (CONS X Y)
(cons a b)
(cons a (b c))
(cons a (cons b (cons c ())))
(cons (a b) (c d))
* (LIST X-1 ... X-N)
(list a b c)
(list (a b) (c d))
(list)
(list (list a b)
(list c d e))
* (APPEND L-1 ... L-N)
(append (a) (b) (c) (x y))
(append (a b) (c d))
* (REVERSE L)
(reverse (a (b c) d))
IA-I 20092010
Cc Ia
=>
=>
=>
=>
(A . B)
(A B C)
(A B C)
((A B) C D)
=>
=>
=>
(A B C)
((A B) (C D))
NIL
=>
((A B) (C D))
=>
=>
(A B C X Y)
(A B C D)
=>
(D (B C) A)
Introducci
on a Lisp
1.13
=>
=>
A
NIL
=>
=>
(B C)
NIL
* (SECOND L)
(second (a b c d))
(second (a))
=>
=>
B
NIL
* (NTH N L)
(nth 2 (a b c d))
=>
* (LENGTH L)
(length (a (b c) d))
=>
* (SUBSEQ L I J)
(subseq (a b c d e f g h) 2 5)
=> (C D E)
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.14
N
umeros
x
Enteros: 14, 0, -7
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.15
Funciones aritm
eticas
* (+ X-1 ... X-N)
(+ 3 7 5)
=>
15
=>
=>
111
-3
=>
70
* (/ X Y)
(/ 6 2)
(/ 5 2.0)
=>
=>
3
2.5
* (MOD X Y)
(mod 7 2)
=>
* (EXPT X Y)
(expt 2 3)
=>
* (SQRT X)
(sqrt 16)
=>
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.16
Valores l
ogicos: T y NIL
x
() () NIL
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.17
Predicados aritm
eticos
x
Predicados aritm
eticos:
* (= X-1 ... X-N)
(= 2 2.0 (+ 1 1))
(= 1 2 1)
=>
=>
T
NIL
=>
=>
T
NIL
=>
=>
T
NIL
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.18
Predicados de tipos
* (ATOM X)
(atom 3)
(atom hola)
(atom (1 2 3))
=>
=>
=>
T
T
NIL
* (SYMBOLP X)
(symbolp a)
(symbolp 3)
=>
=>
T
NIL
* (NUMBERP X)
(numberp 4)
(numberp 3.4)
(numberp (1))
=> T
=> T
=> NIL
* (CONSP X)
(consp (1 . 2))
(consp nil)
(consp (2 5))
=> T
=> NIL
=> T
* (NULL X)
(null (rest (a b)))
(null (rest (a)))
IA-I 20092010
=>
=>
NIL
T
Cc Ia
Introducci
on a Lisp
1.19
Predicados de igualdad
* (EQ X Y)
(eq 3 3)
(eq 3 3.0)
(eq 3.0 3.0)
(eq (first (a b c)) a)
(eq (cons a (b c)) (a b c))
=>
=>
=>
=>
=>
T
NIL
NIL
T
NIL
* (EQL X Y)
(eql 3.0 3.0)
(eql (cons a (b)) (cons a (b)))
=>
=>
T
NIL
* (EQUAL X Y)
(equal (cons a (b)) (cons a (b)))
=>
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.20
Expresiones condicionales
x
Mecanismo de evaluaci
on de un IF (forma especial):
u
Eval
ua <condici
on>:
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.21
Expresiones condicionales
x
<pares>: sucesi
on de expresiones de la forma
(<condicion><consecuencias>)
siendo <consecuencias> una sucesi
on de expresiones Lisp.
Evaluaci
on de un COND (forma especial):
u
Eval
ua los elemento <condicion> hasta que aparece un valor distinto de NIL (verdadero).
Eval
ua la correspondiente <consecuencias>. Eval
ua cada una de las expresiones que
la componen, devolviendo como el valor el u
ltimo obtenido.
Ejemplo:
(cond
((< x 3) (format t "Es peque~
no") x)
((< x 5) (format t "Es mediano") (* x 2))
(t (* x x)))
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.22
Condicionales
* (IF TEST ENTONCES [EN-CASO-CONTRARIO])
(if (> 2 1)
1 2)
=> 1
(if (> 1 2) 1)
=> NIL
* (WHEN TEST E-1 ... E-N)
(when (= 1 1) 1 2 3)
(when (= 1 2) 1 2 3)
=>
=>
3
NIL
Cc Ia
Introducci
on a Lisp
1.23
Operadores l
ogicos
* (NOT X)
(not (= (+ 1 1) 2))
(not (= (+ 1 1) 3))
=>
=>
NIL
T
=>
=>
2
NIL
=>
=>
NIL
3
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.24
Pertenencia:
* (MEMBER E L [:TEST #PREDICADO])
(member x (a x b x c))
(member x (a (x) b))
(setf l ((a b) (c d)))
(member (c d) l)
(member 2.0 (1 2 3))
(member (c d) l :test #equal)
(member 2.0 (1 2 3) :test #=)
(member 2.0 (1 2 3) :test #<)
=>
=>
=>
=>
=>
=>
=>
=>
(X B X C)
NIL
((A B) (C D))
NIL
NIL
((C D))
(2 3)
(3)
Listas de asociaci
on:
* (ASSOC ITEM A-LISTA [:TEST PREDICADO])
(assoc b ((a 1) (b 2) (c 3)))
(assoc (b) ((a 1) ((b) 1) (c d)))
(assoc (b) ((a 1) ((b) 1) (c d)) :test #equal)
IA-I 20092010
Cc Ia
=>
=>
=>
(B 2)
NIL
((B) 1)
Introducci
on a Lisp
1.25
Variables locales
* (LET ((VAR-1 VAL-1)...(VAR-M VAL-M)) E-1 ... E-N)
(setf a 9 b 7)
=> 7
(let ((a 2)(b 3)) (+ a b))
=> 5
(+ a b)
=> 16
(let ((x 2)(y (+ 1 x))) (+ x y)) => Error
* (LET* ((VAR-1 VAL-1) ... (VAR-N VAL-N)) E-1 ... E-M)
(let* ((x 2)(y (+ 1 x))) (+ x y)) => 5
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.26
Definiendo funciones
x
<par
ametros>: sucesi
on de smbolos a los que se asignar
a, temporalmente, el valor
de los argumentos con los que se utilice la funci
on.
<documentaci
on>: cadena en la que se describe la funci
on. Es opcional.
<cuerpo>: sucesi
on de expresiones que se eval
uan cuando se utiliza la funci
on.
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.27
Definiendo funciones
x
Ejemplo:
> (defun cuadrado (x) "Cuadrado de un numero" (* x x))
CUADRADO
(cuadrado 4) se eval
ua a 16:
u
Se eval
ua cuadrado: funci
on definida por el usuario.
Se eval
ua 4: 4
Se asocia al par
ametro de cuadrado, x, el valor 4.
Se eval
ua la expresi
on que compone el cuerpo de cuadrado:
Se eval
ua *: funci
on primitiva de Lisp para calcular el producto.
Se eval
ua x: 4
Se eval
ua x: 4
Se elimina la asociaci
on del par
ametro.
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.28
Definiciones recursivas
x
Recursi
on
> (defun factorial (n)
(if (= n 0)
1
(* n (factorial (- n 1)))))
FACTORIAL
> (factorial 3)
6
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.29
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.30
Descendente num
erico:
(defun f
(... n ...)
(if (= 0 n)
<...>
<... (f ... (- n 1) ...) ...>))
Ejemplo:
(defun factorial
(n)
(if (= 0 n)
1
(* n (factorial (- n 1)))))
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.31
Listas lineales:
(defun f
(... l ...)
(if (endp l)
<...>
<... (first l)
(f ... (rest l) ...) ...>))
Ejemplo:
(defun suma-lista
(l)
(if (endp l)
0
(+ (first l)
(suma-lista (rest l)))))
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.32
Ejemplos de recursi
on en Lisp
x
Ejemplo: funci
on subconjunto
;;;
;;;
;;;
;;;
;;;
;;;
;;;
(SUBCONJUNTO L1 L2)
> (subconjunto () (s 3 e 4))
T
> (subconjunto (4 3) (s 3 e 4))
T
> (subconjunto (4 a 3) (s 3 e 4))
NIL
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.33
Ejemplos de recursi
on en Lisp
x
Ejemplo: funci
on elimina-uno
;;;
;;;
;;;
;;;
;;;
;;;
;;;
(ELIMINA-UNO X
> (elimina-uno
(A B C D)
> (elimina-uno
(A C D)
> (elimina-uno
(A C B D)
L)
3 (a b c d))
b (a b c d))
b (a b c b d))
(defun elimina-uno (x l)
(cond ((endp l) l)
((equal x (first l)) (rest l))
(t (cons (first l) (elimina-uno x (rest l))))))
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.34
Ejemplos de recursi
on en Lisp
x
Ejemplo: funci
on permutacion
;;;
;;;
;;;
;;;
;;;
;;;
;;;
(PERMUTACION L1 L2)
> (permutacion (x 1 3 4) (3 2 x 4))
NIL
> (permutacion (x 2 3 4) (3 2 x 4))
T
> (permutacion (x 2 3 4) (3 2 x 4 4))
NIL
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.35
Ejemplos de recursi
on en Lisp
x
Recursi
on cruzada: funciones par-p e impar-p
;;;
;;;
;;;
;;;
;;;
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.36
Ejempos de recursi
on en Lisp
x
Ejemplo: funci
on comprime
;;;
;;;
;;;
;;;
;;;
(COMPRIME LISTA)
> (comprime (a a b c c c a d d d d d e))
((2 A) B (3 C) A (5 D) E)
> (comprime (a b c c a d e))
(A B (2 C) A D E)
Cc Ia
Introducci
on a Lisp
1.37
El operador b
asico de iteraci
on: DO
x
Ejemplo:
(defun lista-cuadrados (ini fin)
(do ((i ini (1+ i)))
((> i fin) terminado)
(format t "~a ~a~%" i (* i i))))
u
La primera parte del do especifica las variables del bucle (i en este caso), su valor
inicial (ini) y c
omo se actualiza en cada iteraci
on (se incrementa en uno)
Finalmente, la expresi
on final especifica qu
e hacer en cada iteraci
on (escribir una
lnea con i y con el cuadrado de i)
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.38
El operador b
asico de iteraci
on: DO
x
Sesi
on:
> (lista-cuadrados 1 5)
1 1
2 4
3 9
4 16
5 25
TERMINADO
(n)
(1- j))
(* j f)))
0) f)))
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.39
El operador b
asico de iteraci
on: DO
x
Otro ejemplo:
;;;
;;;
;;;
;;;
;;;
(ESPECULAR LISTA)
> (especular (a b c c b a))
T
> (especular (a b c g h h g c d a))
NIL
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.40
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.41
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.42
Ejemplos:
> (defun factor (x)
(or (loop for i from 2 to (sqrt x)
thereis (when (= (mod x i) 0)
i))
x))
FACTOR
> (factor 35)
5
> (defun es-primo (x)
(= x (factor x)))
ES-PRIMO
> (es-primo 7)
T
> (es-primo 35)
NIL
> (loop for x from 2 to 100
count (es-primo x))
25
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.43
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.44
Opciones iniciales:
(LOOP FOR <VARIABLE> FROM <INICIO> TO <FIN> ...)
(LOOP FOR <VARIABLE> FROM <INICIO> TO <FIN>
BY <INCREMENTO> ...)
(LOOP FOR <VARIABLE> IN <LISTA> ...)
(LOOP WHILE <CONDICION> ...)
(LOOP UNTIL <CONDICION> ...)
Opciones centrales:
(LOOP ... WHEN <CONDICION> ...)
Opciones finales:
(LOOP
(LOOP
(LOOP
(LOOP
(LOOP
(LOOP
IA-I 20092010
...
...
...
...
...
...
DO <EXPRESION>)
COLLECT <EXPRESION>)
APPEND <EXPRESION>)
THEREIS <EXPRESION>)
COUNT <EXPRESION>)
SUMMING <EXPRESION>)
Cc Ia
Introducci
on a Lisp
1.45
Escritura
x
La funci
on format:
(FORMAT DESTINO CADENA-DE-CONTROL X-1 ... X-N)
> (format t "~&Linea 1 ~%Linea 2")
Linea 1
Linea 2
NIL
> (format t "~&El cuadrado de ~a es ~a" 3 (* 3 3))
El cuadrado de 3 es 9
NIL
> (setf l (a b c))
(A B C)
> (format t
"~&La longitud de la lista ~a es ~a"
l (length l))
La longitud de la lista (A B C) es 3
NIL
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.46
Escritura
x
~&
comienza nueva l
nea,
si no est
a al comienzo de una
~%
comienza nueva l
nea
~Na
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.47
Lectura
x
La funci
on read
(READ)
> (read)
a
A
> (setf a (read))
2
2
> a
2
> (* (+ (read) (read))
3
4
7
> (read)
(+ 2 3)
(+ 2 3)
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.48
Lectura
x
read no eval
ua. Funci
on eval:
(EVAL EXPRESION)
> (eval (read))
(+ 2 2)
4
Ejemplo:
(defun calcula-cuadrados ()
(loop
(let ((aux (read)))
(if (numberp aux)
(format t "~&El cuadrado de ~a es ~a~%"
aux (* aux aux))
(return fin)))))
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.49
Matrices
x
Creaci
on:
(MAKE-ARRAY DIMENSIONES
[:INITIAL-CONTENTS EXPRESION])
Cc Ia
2)
c)
3)
z)))
b c)
2 3)
y z))))
Introducci
on a Lisp
1.50
Matrices
x
Acceso:
3) (X Y Z))
0 0)
1 1)
2 2)
Modificaci
on:
Cc Ia
Introducci
on a Lisp
1.51
Matrices
x
Ejemplo
;;;
;;;
;;;
;;;
;;;
;;;
;;;
;;;
(SUMA-COLUMNAS MATRIZ)
> (setf mat
(make-array (3 3)
:initial-contents
((1 2 3) (4 5 6) (7 8 9))))
#2A((1 2 3) (4 5 6) (7 8 9))
> (suma-columnas mat)
#(12 15 18)
Cc Ia
Introducci
on a Lisp
1.52
Estructuras (ejemplo)
> (defstruct persona
(nombre nil)
(estado casado)
(calle nil)
(ciudad Sevilla))
PERSONA
> (setf ejemplo-1
(make-persona :nombre ana :calle (Reina Mercedes)))
#S(PERSONA :NOMBRE ANA :ESTADO CASADO :CALLE (REINA MERCEDES) :CIUDAD SEVILLA)
> (setf ejemplo-2
(make-persona :nombre pepe :ciudad Huelva))
#S(PERSONA :NOMBRE PEPE :ESTADO CASADO :CALLE NIL :CIUDAD HUELVA)
> (persona-ciudad ejemplo-1)
SEVILLA
> (persona-nombre ejemplo-2)
PEPE
> (setf (persona-nombre ejemplo-1) (Ana Maria))
(ANA MARIA)
> ejemplo-1
#S(PERSONA :NOMBRE (ANA MARIA) :ESTADO CASADO
:CALLE (REINA MERCEDES) :CIUDAD SEVILLA)
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.53
Estructuras (ejemplo)
> (setf ejemplo-3 ejemplo-1)
#S(PERSONA :NOMBRE (ANA MARIA) :ESTADO CASADO
:CALLE (REINA MERCEDES) :CIUDAD SEVILLA)
> (setf (persona-calle ejemplo-3) (tetuan))
(TETUAN)
> ejemplo-3
#S(PERSONA :NOMBRE (ANA MARIA) :ESTADO CASADO
:CALLE (TETUAN) :CIUDAD SEVILLA)
> ejemplo-1
#S(PERSONA :NOMBRE (ANA MARIA) :ESTADO CASADO
:CALLE (TETUAN) :CIUDAD SEVILLA)
> (setf ejemplo-4 (copy-persona ejemplo-2))
#S(PERSONA :NOMBRE PEPE :ESTADO CASADO :CALLE NIL :CIUDAD HUELVA)
> (setf (persona-ciudad ejemplo-4) cadiz)
CADIZ
> ejemplo-4
#S(PERSONA :NOMBRE PEPE :ESTADO CASADO :CALLE NIL :CIUDAD CADIZ)
> ejemplo-2
#S(PERSONA :NOMBRE PEPE :ESTADO CASADO :CALLE NIL :CIUDAD HUELVA)
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.54
Estructuras
x
Creaci
on de estructuras con defstruct:
(DEFSTRUCT (NOMBRE (:CONSTRUCTOR FUNCION-CONSTRUCTURA)
(:CONC-NAME PREFIJO-)
(:PRINT-FUNCTION FUNCION-DE-ESCRITURA))
CAMPO-1
...
CAMPO-N)
Ejemplo (funci
on de escritura):
(defun escribe-punto (punto &optional (canal t) profundidad)
(format canal "Punto de abcisa ~a y ordenada ~a"
(coordenada-x punto)
(coordenada-y punto)))
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.55
Estructuras (ejemplo)
> (setf *punto-1* (crea-punto :x 2 :y 3))
Punto de abcisa 2 y ordenada 3
> (coordenada-y *punto-1*)
3
> (setf (coordenada-y *punto-1*) 5)
5
> *punto-1*
Punto de abcisa 2 y ordenada 5
> (punto-p *punto-1*)
T
> (punto-p (2 5))
NIL
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.56
Estructuras (ejemplo)
> (setf *punto-2* (copy-punto *punto-1*))
Punto de abcisa 2 y ordenada 5
> (equal *punto-1* *punto-2*)
NIL
> (equalp *punto-1* *punto-2*)
T
> (setf (coordenada-y *punto-2*) 3)
3
> *punto-2*
Punto de abcisa 2 y ordenada 3
> (setf *punto-3* (crea-punto :y 3 :x 2))
Punto de abcisa 2 y ordenada 3
> (equalp *punto-2* *punto-3*)
T
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.57
Las matrices no son tan flexibles como las listas, pero permiten acceso
r
apido a sus componentes y ahorran espacio
u
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.58
Tablas hash
x
Creaci
on (MAKE-HASH-TABLE):
> (setf *tabla* (make-hash-table))
#S(HASH-TABLE EQL)
Acceso y actualizaci
on (GETHASH):
> (gethash color *tabla*)
NIL ;
NIL
> (setf (gethash color *tabla*) rojo)
ROJO
> (setf (gethash talla *tabla*) grande)
GRANDE
> (gethash color *tabla*)
ROJO ;
T
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.59
Tablas hash
x
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.60
Argumentos opcionales
(defun factorial (n &optional (resultado 1))
(if (= n 0)
resultado
(factorial (- n 1) (* n resultado))))
(factorial 3)
(factorial 3 4)
=> 6
=> 24
Argumentos clave
(defun f (&key (x 1) (y 2))
(list x y))
(f :x 5 :y 3)
(f :y 3 :x 5)
(f :y 3)
(f)
IA-I 20092010
=>
=>
=>
=>
Cc Ia
(5
(5
(1
(1
3)
3)
3)
2)
Introducci
on a Lisp
1.61
Valores de un smbolo
x
Hemos visto:
DATOS EN LISP:
- N
umeros: 3, 2.5,
- Cadenas: "hola",
- S
mbolos: adios,
- Listas: (1 s 3),
- Estructuras
- Matrices, etc.
14.3, ...
"el perro come", ...
fun, fact, cuadrado, ...
(1 (a (b))), ...
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.62
Valores de un smbolo
x
Usualmente:
> (setf cuadrado 8)
8
> (defun cuadrado (x) (* x x))
CUADRADO
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.63
Evaluaci
on en Lisp
u
Lambdas: la funci
on representada
Ejemplo: (lambda (x) (* 2 x))
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.64
Evaluaci
on en Lisp (continuaci
on)
u
=>
12
La funci
on function (#Exp): valor funcional de Exp
Ejemplos: #cuadrado => #<CLOSURE :LAMBDA (X) (* X X)>
#(lambda (x) (* 2 x)) =>
#<CLOSURE :LAMBDA (X) (* 2 X)>
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.65
La funci
on FUNCALL
(FUNCALL FN E-1 ... E-N)
(funcall #+ 1 2 3)
(funcall #cuadrado 4)
(funcall #(lambda (x) (* 2 x)) 3)
=> 6
=> 16
=> 6
La funci
on APPLY
(APPLY FN ARGS)
(apply #+ (1 2 3))
(apply #max (4 5 7))
(apply #(lambda (x y) (* 2 x y)) (3 4))
=> 6
=> 7
=> 24
Observaciones:
u
El primer argumento de funcall y de apply debe ser algo cuyo valor sea una funci
on
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.66
=> (1 4 9 16 25)
=> (T NIL T)
=> (B C)
=> ((A) (C))
=> 3
=> 2
IA-I 20092010
Cc Ia
=> B
=> (A)
Introducci
on a Lisp
1.67
=> 1
=> 2
IA-I 20092010
Cc Ia
=> B
=> (A)
Introducci
on a Lisp
1.68
#atom (1 a))
#atom ((1) a))
#<= (1 2) (1 3))
#< (1 2) (1 3))
=>
=>
=>
=>
T
NIL
T
NIL
=>
=>
=>
=>
T
NIL
T
NIL
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.69
Bibliografa
x
Steele, G.L. Common Lisp the Language, 2nd edition (D. P., 1990).
http://www-2.cs.cmu.edu/afs/cs.cmu.edu/project/ai-repository/ai/html/cltl/cltl2.html
IA-I 20092010
Cc Ia
Introducci
on a Lisp
1.70