Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Introduccin
z
z
Origen: 1958
John McCarthy, pionero en IA, empez
a trabajar
t b j con lla primera
i
implementacin de Lisp en 1958.
McCarthy, Recursive functions of symbolic
expressions
i
and
d th
their
i computation
t ti b
by
machine, Communications of the ACM, Vol
3, No 4, 1960.
Introduccin
z
z
z
Datos
z
Expresiones LISP:
tomos
Smbolos:
z simbolo, simbolo3,ejemplo-de-simbolo
z Especiales: nil, t
Keywords (tiquetas):
z :ejemplo, :keyword
Strings (distincin minsculas-maysculas)
z abc, ABC, string
Nmeros:
z enteros: 33, 4, -5
z racionales: -3/5, 4/8
z reales: 3.23, -4.78, 3.33E45
Listas
Colecciones de expresiones
(a b (c (d)) e), (), (3 abc)
Listas: Grupo de tomos. Las listas tambin se
pueden agrupar en niveles superiores.
Evaluacin
z
z
Ejemplos de evaluaciones
tomos
Smbolos:
z Su evaluacin es su valor como variable
z T y NIL se evalan a s mismos
Nmeros, Strings y Keywords
z Se evalan a s mismos
Listas
() se evala a NIL
Una lista no vaca evaluable debe tener como primer
elemento un smbolo
Notacin prefijo. El primer
z (+ 3 (+ 2 5))
elemento de una lista indica
z (quote (a b c))
qu se desea hacer
z (setf variable (+ 3 4))
Operadores de
manipulacin de listas, I
z
Operadores de
manipulacin de listas, II
z
Caractersticas comunes:
Al evaluarlos, se obtiene error cuando se
aplican sobre datos que no siguen su
patrn sintctico.
La mayora son funciones (no macros).
FIRST o CAR
Devuelve el primer elemento de la lista
(first <lista>)
(first (a b c)) >> A
S CO
SECOND,
THIRD, ..., NTH
(second <lista>)
(second (a b c)) >>> B
Operadores de
manipulacin de listas, III
z
REST o CDR
Devuelve la lista sin el primer elemento
(rest
( t <lista>)
li t )
(rest (a b c)) >> (B C)
NTHCDR
(nthcdr <expresion> <lista>)
(nthcdr (+ 1 1) (a b c)) >> (C)
Cmo
C
o ccrear
ea listas?
s as
cons
append
list
Operadores de
manipulacin de listas, IV
z
CONS
(cons <expresion> <lista>)
Crea una lista cuyo primer elemento es
<expresion> y cuyo resto es <lista>
(cons (a b) (c d e)) >>> ((A B) C D E)
APPEND
(append <lista>*)
(append (a b) (c d)) >>> (A B C D)
(append
(
d '(
'(a b) '(
'(c (d)) '(
'(e f)) >>> (A B C (D) E F)
ERROR
LIST
(list <expresion>*)
(list (a b) (c d)) >>> ((A B) (C D))
(list '(a b) '(c (d)) '(e f)) >>> ((A B) (C (D)) (E F))
(list a b c) >>> ?
(A B C)
Operadores de
manipulacin de listas, V
z
Operadores destructivos:
Suelen ser macros
(setf
( tf a (a
( b));
b)) ((setf
tf b (c
( d));
d)) ((setf
tf c (e
( f))
NCONC (append). Funcin.
z (nconc a b) >>> (A B C D)
z a >> (
(A B C D)) ; b >>> (C
( D))
Modifica la primera lista
POP. Macro
z (pop c) >>> E
z c >>> (F)
Saca elemento. Modifica la lista
10
10
Operadores de
manipulacin de listas, VI
z
Otras funciones:
LAST
z (last <lista>)
z (last (a b c)) >>> (C)
z (last ((A B) (C D))) >>> ((C D))
Devuelve el ltimo elemento
(del primer nivel de anidamiento)
REVERSE
z (reverse <lista>)
z (reverse (a b c)) >>> (C B A)
z (reverse '((A
((A B) (C D))) >>> ((C D) (A B))
LENGTH
z (lenght <lista>)
z (lenght
(l
ht (
(a b c))
)) >>> 3
Longitud de la lista, del primer nivel
SUBST
z (
(subst <nuevo> <viejo>
j <lista>))
z (subst a b (a b c)) >>> (A A C)
Sustituir con <nuevo> todas las
apariciones de <viejo> en <lista>
11
11
PROGN, PROG1
Permiten escribir instrucciones compuestas
(como { y } en el lenguaje C)
Evalan todas las sentencias que contienen
y devuelven la ltima o primera sentencia.
(progn (+ 3 4) (+ 4 5)) >>> 9
(prog1 (+ 3 4) (+ 4 5)) >>> 7
(progn [<sentencia1>]
[<sentencia1>] [<sentenciaN>])
(prog1 <sentencia1> [<sentencia2>]
[<sentenciaN>])
progn puede no recibir ningun argumento, entoces
devuelve NIL
prog1 tiene que recibir al menos una sentencia
12
12
PRINT
(PRINT <forma>)
Mostrar informacin al usuario
usuario.
Si el valor de <forma> lo llamamos A, el
valor es A. Adicionalmente al ejecutarse,
tambin se imprime
p
A
> (progn (setf x (print A)) (+ 3 4))
A
>>> 7
>x
>>> A
READ
(SETF variable (READ))
Leer informacin del usuario
13
13
Operadores
p
matemticos
+, -, *, /, ABS
EXPT
(expt 2 4) >>> 16
MAX,
MAX MIN
(max 2 3 4 5) >>> 5
FLOAT
((float 1/2)) >>> 0.5
ROUND
(round 3.2) >> 3
14
14
Condicionales, I
z
IF (macro)
* when
* unless *cond
Sintaxis:
(if <expresion> <forma1> [forma2])
Si el valor lgico de <expresin> es verdadero,
devuelve el valor de <forma1>. Si es falso,
devuelve el valor de <forma2>.
15
15
Condicionales, II
z
WHEN (macro)
Sintaxis:
(when <expresion>
<forma-1> <forma-2> ...<forma-n>)
Si el valor lgico de <expresin> es verdadero,
ejecuta las formas <forma-1>, <forma-2>, ...
<forma-n>
f
y devuelve
d
l como valor
l fi
finall ell valor
l
de <forma-n>. Si es falso, devuelve NIL.
16
16
Condicionales, III
z
UNLESS (macro)
Sintaxis:
(unless <expresion>
<forma-1> <forma-2> ...<forma-n>)
Si el valor lgico de <expresin> es falso,
ejecuta las formas <forma-1>, <forma-2>, ...
<forma-n>
f
y devuelve
d
l como valor
l fi
finall ell valor
l
de <forma-n>. Si es verdadero, devuelve NIL.
17
17
Condicionales, IV
z
COND (macro)
Sintaxis:
(cond (<condicin
(<condicin-1>
1>
<forma-11> <forma-12> ...<forma-1-a1>)
(<condicin-2>
<forma-21> <forma-22> ...<forma-2-a2>)
...
(<condicin-n>
<forma-n1>
<forma n2> ...<forma-n-an>))
<forma-n2>
<forma n an>))
Cuando encuentra una <condicion-i> cuyo valor
lgico de es verdadero, ejecuta las formas
<forma-i1>, <forma-i2>, ... <forma-i-ai> y
devuelve como valor final el valor de
<forma-i-ai>.
18
Predicados
z
z
z
(<predicado> <expresion>)
ATOM, STRINGP, NUMBERP, SYMBOLP,
LISTP
Para saber de qu tipo es un dato
(atom a) >>> T ; (atom NIL) >>> T
(listp a) >>> NIL ; (listp NIL) >>> T
Hoja 1, ejercicio 3
z Numricos:
Los operandos deben ser nmeros
>, <, <=, >=, ZEROP, PLUSP, MINUSP,
EVENP, ODDP
z
Hoja 1, ejercicio 5
19
Predicados de igualdad, I
z
z
(= <numero> <numero>)
(= 3 (+ 2 1)) >>> T; (= 3 3.0) >>> T
EQ
EQL
E T cuando:
Es
d
i.
Cuando <exp1> y <exp2> son tomos y
ii.
(eq <exp1> <exp2>) se evala a T
Ejemplos:
1) (eql (cons a nil) (cons a nil)) >>> NIL (falla i)
2) (setf x (cons a nil)) >>> (A)
(eql x x) >>> T
20
20
Predicados de igualdad, II
z
EQUAL
Comprueba a nivel simblico si dos
expresiones son iguales (al imprimirlas)
(equal x y) >>> T
(equal (first x) (first y)) >>> T
(equal z x) >>> T
(equal 3 3.0) >>> NIL
21
21
Operadores lgicos, I
z
AND (macro)
(and <exp1> <exp2> ... <expn>)
Si ell valor
l lgico
l i d
de ttodas
d llas <expi>
i es
verdadero, devuelve el valor de la ltima
(<expn>). En caso contrario, devuelve NIL.
Cuando encuentra alguna <expi> con valor
lgico falso, ya no sigue evaluando el
resto de las <exp>.
(and (evenp 2) (plusp -3) (print 3)) >>> NIL
OR (macro)
(or <exp1> <exp2> ... <expn>)
expi
Si el valor lgico de alguna de las <expi>
es verdadero, devuelve su valor. En caso
contrario, devuelve NIL.
Cuando encuentra alguna <expi> con valor
lgico verdadero, ya no sigue evaluando
el resto de las <exp>.
(or (evenp 2) (plusp -3) (print 3)) >>> T 22
22
Operadores lgicos, II
z
NOT
(not <exp>)
Si ell valor
l lgico
l i d
de <exp1>
1 es verdadero,
d d
devuelve NIL. En caso contrario devuelve
T.
(not (oddp 2)) >>> T
(not (list 2 3)) >>> NIL
(not (oddp 3) >>> NIL
Hoja 1, ejercicio 6
23
23
Variables locales y
globales, I
z
24
24
Variables locales y
globales, II
z
Variables locales
LET (macro)
Ejemplo:
>(prog1
(let ((x a) (y b) z)
(setf z (list x y))
(list z z))
(list 'final 'evaluacion))
>>> ((A B) (A B))
Sintaxis:
(let ((<var-1> <valor-inicial-1>)
(<var-2> <valor-inicial-2>)
...
(<var-n> <valor-inicial-n>))
<forma-1>
<forma-2>
....
<forma-m>)
LET: asignacin de valores en paralelo
LET*: asignacin de valores de forma secuencial
Se puede: (let* ( (x a) (z x))
25
25
Definicin de funciones, I
z
Ejemplo:
>(defun factorial (numero)
((cond ((
((= numero 0)) 1))
(t (* numero (factorial (- numero 1))))))
>>> FACTORIAL Si la sintaxis est bien, LISP
> (factorial 3) >>> 6 devuelve el nombre de la funcin.
Sintaxis:
(defun <nombre-funcion> (<lista-argumentos>)
[(let/let* ] para definir variables locales
<forma-1>
<forma-2>
f
2
...
<forma-n>)
Comentarios:
El valor de la funcin es el de la ltima forma
(<forma-n>). No se puede utilizar return para
devolver el valor de retorno (como en el lenguaje
C).
Los argumentos son tambin variables locales.
Valor de un smbolo como variable y como
funcin (una variable y una funcin pueden tener
el mismo nombre).
26
26
Definicin de funciones, II
z
Argumentos
Nmero fijo de argumentos:
(defun f (x y) (list x y))
(f a b c) >>> error
27
27
28
Definicin de funciones, IV
z
Operadores de iteracin
DOTIMES
(dotimes (i 3 (list 'final)) (list i i)) >>> (FINAL)
Sintaxis:
(dotimes (<var> <num-iter> [<valor-retorno])
<forma-1> ... <forma-n>)
DOLIST
(dolist (i (list a b) (list 'final)) (list i i)) >> (FINAL)
Sintaxis:
(d li t ((<var> <lista>
(dolist
li t [[<valor-retorno])
l
t
])
<forma-1> ... <forma-n>)
WHILE
Sintaxis:
(while <condicion> <forma-1> ... <forma-n>)
LOOP
Sintaxis (la ms sencilla):
(loop <forma-1> ... <forma-n>)
29
Definicin de funciones, V
z
Ejercicios de iteracin
>> (dotimes (i 3 (list 'final)) (print i))
0
1
2
(FINAL)
30
30
Definicin de funciones, VI
z
T
Todos
d llos componentes
t mismo
i
significado
i ifi d
que en defun. Contar los elementos de una lista
(count-if
que cumplan
>>> 2
31
31
FUNCALL
(funcall <funcion> <arg1> ... <argn>)
Son equivalentes:
(f a b) >>> (A B)
(funcall #f a b) Con funcall necesario #
function <expresion> # <expresion>
APPLY
(apply <funcion> (<arg1> ... <argn>))
Son equivalentes:
(f a b) >>> (A B)
(apply #f (a b))
Diferencia entre funcall y apply?
La fforma d
L
de cmo
se presentan
t
los datos sobre los que se aplica
la funcin, con apply los datos
van dentro de ( y )
32
32
MAPCAR
(mapcar <funcion> <lista1> ... <listan>)
Aplicacin de funciones a elementos de listas
> (mapcar #(lambda (x y) (list x x y y))
(a b c)
( e f))
))
(d
>>> ((A A D D) (B B E E) (C C F F))
Qu ocurre si las listas son
de distintos tamaos?
Hace lo comn
REMOVE
(remove <elemento> <lista>
[:test <funcion-igualdad>])
Obtener lista a partir de otra, borrando los
elementos que cumplan una condicin
(remove b (a b c)) >>> (A C)
Equivale a (remove b (a b c) :test #eql)
(remove (a
(a b) (a
(a (a b) c)) >>> (A (A B) C)
(remove (a b) (a (a b) c) :test #equal) >>> (A C)
Hoja 1, ejercicio 9
33
33
DELETE
Versin destructiva de REMOVE
QU OCURRE
OCURRE:
(setf l '(a (a b) c) )
(delete '(a b) l)
(delete '(a
(a b) l :test
#'equal)
MEMBER
Sintaxis:
(member <elemento> <lista>
[:test <funcion-gualdad>])
(member b (a b c)) >>> (B C)
Equivale a (member b (a b c) :test #eql)
34
34
Observacin:
Al utilizar #<f>, si <f> es un macro se
tienen resultados inesperados. No usarlos,
por tanto.
p
35
35
<simbolo>
Devuelve el string y su n de
caracteres hasta el primer blanco
<string>
<string>
s g
(subseq <string>
string <posicion>)
posicion ) >>>
substring a partir de <posicion>
(concatenate <string>+)
36
36
Arrays
z
z
37
37
Estructuras, I
z
38
38
Estructuras, II
nombreestructura-campoestructura :
Acceder a un campo de la estructura
39
Alternativa a estructuras
z
40
DEBUGGING
z
TRACE
Funcin recursiva:
(defun factorial (n)
(if (= n 0) 1 (* n (factorial (- n 1)))))
(trace factorial)
> ((factorial 2))
FACTORIAL [call 5 depth 1] with arg: 2
FACTORIAL [call 6 depth 2] with arg: 1
FACTORIAL [call 7 depth 3] with arg: 0
FACTORIAL [call
[ ll 7 depth
d th 3] returns
t
value:
l
1
FACTORIAL [call 6 depth 2] returns value: 1
FACTORIAL [call 5 depth 1] returns value: 2
UNTRACE
(untrace), (untrace factorial)
41
41
Comentarios
Despus de ; y hasta final de lnea
Macros
Permiten definir operadores que no
evalan sus argumentos:
COND
COND, SETF,
SETF DEFUN son macros
(defmacro defun
(nombre-funcion lista-argumentos
&rest formas)
......)
Hoja 1, ejercicio 14, 15
42
42
Edicin,
carga compilacin:
COMPILE-FILE, LOAD-FILE
Entrada-salida:
PRINT, READ, FORMAT, READ-LINE,
READ-CHAR
z
z
z
z
z
43
43