Introducción a LISP 
Sergio Jiménez Celorrio 
Departamento Ingeniería Informática – UC3M
Introducción 
 List Processing 
 Desarrollado en 1958, en el MIT por John McCarthy 
 Lenguaje mas popular en IA 
– Declarativo 
– Alto Nivel 
 Diferentes Intérpretes 
– CLISP, Allegro, CMUCL, … 
 Aplicaciones 
– Emacs, Autocad…
Tipos de datos 
 Listas, Elemento Fundamental del Lenguaje 
– (funcion x y z) 
– (print “Hola Mundo”) 
 Átomos 
– Símbolos: var1, contador, … 
– Valores Lógicos: t, nil 
– Números: 3, 3.001 
– Strings: “Hola mundo” 
 Otros: 
– arrays, vectores, tablas hash,… 
– Estructuras y Clases definidas por el usuario
Operadores Básicos 
 Numéricos: 
– Suma 
 (+ 1 2) 
 (+ 1 2 3 4) 
– Resta 
 (- 4 2) 
 (- 10 2 2 2) 
– Producto 
 (* 3 2) 
 (* 2 2 2 2) 
 Lógicos: 
– And 
 (and t nil) 
 (and 1 2 3) 
– Or 
 (or t nil) 
 (or 1 2 3) 
– Not 
 (not nil) 
 (not 1), 
 (not “hola”)
Evaluación de una expresión LISP (I) 
 Directamente en el prompt del intérprete 
 Desde un fichero 
 (load “prueba.lisp”)
Evaluación de una expresión LISP (II) 
 ‘ y quote impide la evaluación de una expresión: 
 (+ 3 5) 
 ‘(+ 3 5) 
 (quote (+ 3 5)) 
 eval evalúa una expresión dos veces 
 (eval (quote (+ 3 5))) 
 (eval ‘(+ 3 5))
Variables 
 Inicializaciones 
 (defvar *contador* 1) 
 Cambiando el valor a una variable 
 (setf *contador* 2) 
 Variables locales 
 (let ((contador 1)) 
(print contador)) 
 (let ((contador 1)) 
(setf contador 2) 
(print contador))
Condiciones 
 (if (= *a* *b*) (print “hola”) (print “adios”)) 
 (when (= *a* *b*) (print “hola”)) 
– Equivalente a (if (= *a* *b*) (print “hola”)) 
 (unless (= *a* *b*) (print “hola”)) 
– Equivalente a (if (not (= *a* *b*)) (print “hola”)) 
 (Cond ((= *a* *b*) (print “uno”)) 
((> *a* *b*) (print “dos”)) 
(t (print “tres”)))
Relaciones de Igualdad 
 EQ (el más específico), compara si dos variables apuntan al mismo objeto. 
 (eq ‘(a b c) ‘(a b c)) 
NIL 
 (setf x 1) (setf y x) (eq x y) 
T 
 EQL como EQ pero también compara números si son del mismo tipo o para caracteres 
 (eql x y) 
T 
 (eql 3 3) 
T 
 (eql 3.0 3) 
NIL 
 EQUAL (El más general) 
 (equal ‘(a b c) ‘(a b c )) 
T 
 (equal 3.0 3) 
T 
 (equal “hola” “HOLA”) 
NIL 
 EQUALP Como EQUAL pero compara cadenas en mayúsculas y minúsculas 
 (equalp “hola” “HOLA”) 
T 
 Relaciones numéricas: = <, >, <=, >=
Bucles 
 (dotimes (i 3) (print i)) 
 (dolist (i ‘(0 1 2)) (print i)) 
 (setf *i* 0) 
(loop (when (= *i* 3) (return)) 
(print *i*) 
(setf *i* (+ *i* 1)))
Creación de Listas 
 (setf *lista* ‘(1 2 3 4 5)) 
 (setf *lista* (list 1 2 3 4 5))
Funciones Básicas de Manejo de 
Listas 
 (car *lista*) = (first *lista*) = (nth 0 *lista*) 
 (rest *lista*) = (cdr *lista*) 
 (last *lista*) = (list (nth (- (length lista) 1) *lista*)) 
 (push 8 *lista*) 
 (pop *lista*) 
 (cons 1 ‘(2 3 4 5)) 
 (append ‘(1 2) ‘(3 4 5)) 
 (member 1 ‘(3 4 1 5 6)) 
 (sort ‘(3 2 1) ‘<) 
 (remove 1 ‘(3 4 1 5 6)) 
 (length ‘(3 2 5))
Declaración de Funciones de Usuario 
 (defun nombre (args) “descripcion” (expresión)) 
– (defun mi-funcion (lista) 
“obtiene el primer elemento del 
argumento lista” 
(car lista)) 
 Devuelven el valor de la última expresión
Apply y Funcall 
 Permiten aplicar una función a un conjunto 
de datos 
– Apply (apply #’+ ‘(2 3)) 
– Funcall: (funcall #’+ 2 3)
Mapcar 
 Permite aplicar una función a cada uno de 
los elementos de una lista. 
(mapcar #’list ‘(1 2 3 4)) 
(mapcar #’+ ‘(1 2 3 4)’(10 20 30 40))
Funciones Lambda 
 Permite definir funciones en tiempo de ejecución 
– Muy útil para las funciones tipo map o para definir 
funciones de Test 
 (mapcar #’(lambda (x) (format t “El doble de ~a es ~a~&“ x (* 2 x))) 
‘(1 2 3)) 
 (member 2 ‘((1 2) (3 4) (5 6)) 
:test #’(lambda (x y) (equal x (second y))))
Entrada / Salida 
 Lectura sobre entrada estándar 
 (setf *respuesta* (read)) 
 Escritura sobre salida estándar 
 (print “Hola mundo”) 
 Salida con formato (format t literal argumentos) 
– El literal puede indicar: 
~% nueva línea 
~d número 
~a carácter 
 (format t “el cuadrado de ~d es ~d ~&” 3 (* 3 3)) 
 Abrir un fichero. 
 (setq fichero (open “nombre-fichero” :direction :input)) 
 Escribir en un fichero. 
 (format fichero “el cuadrado de ~d es ~d ~&” 3 (* 3 3)) 
 Cerrar fichero 
 (close fichero)
Buenos hábitos de programación 
 Introducir comentarios 
– ; para comentar una línea 
– #| para comentar 
Varias líneas |# 
 Nombres de variables y funciones descriptivos 
 Funciones con pocas líneas y cortas 
 Utilice editor que resalte emparejado de paréntesis y con sangría automática 
– (i.e. emacs o xemacs) 
 Use cond en lugar de ifs anidados 
 Variables globales comiencen y acaben con * 
– *variable1* 
 Utilice lógica positiva al dar nombre a las funciones y predicados: que 
devuelvan t si es cierto. 
– (numberp 5)
Libros 
 LISP : el lenguaje de la inteligencia artificial / 
A.A. Berk 
 AutoLISP versión 12 / José Antonio Tajadura 
Zapirain, Javier López Fernández 
 LISP / Patrick Henry Winston, Berthold Klaus 
Paul Horn 
 Common LISP : the language. Steele, Guy L.
Web 
 Referencia Funciones Lisp 
– http://www.lispworks.com/documentation/HyperSpec/Front/index.htm

Curso lisp

  • 1.
    Introducción a LISP Sergio Jiménez Celorrio Departamento Ingeniería Informática – UC3M
  • 2.
    Introducción  ListProcessing  Desarrollado en 1958, en el MIT por John McCarthy  Lenguaje mas popular en IA – Declarativo – Alto Nivel  Diferentes Intérpretes – CLISP, Allegro, CMUCL, …  Aplicaciones – Emacs, Autocad…
  • 3.
    Tipos de datos  Listas, Elemento Fundamental del Lenguaje – (funcion x y z) – (print “Hola Mundo”)  Átomos – Símbolos: var1, contador, … – Valores Lógicos: t, nil – Números: 3, 3.001 – Strings: “Hola mundo”  Otros: – arrays, vectores, tablas hash,… – Estructuras y Clases definidas por el usuario
  • 4.
    Operadores Básicos Numéricos: – Suma  (+ 1 2)  (+ 1 2 3 4) – Resta  (- 4 2)  (- 10 2 2 2) – Producto  (* 3 2)  (* 2 2 2 2)  Lógicos: – And  (and t nil)  (and 1 2 3) – Or  (or t nil)  (or 1 2 3) – Not  (not nil)  (not 1),  (not “hola”)
  • 5.
    Evaluación de unaexpresión LISP (I)  Directamente en el prompt del intérprete  Desde un fichero  (load “prueba.lisp”)
  • 6.
    Evaluación de unaexpresión LISP (II)  ‘ y quote impide la evaluación de una expresión:  (+ 3 5)  ‘(+ 3 5)  (quote (+ 3 5))  eval evalúa una expresión dos veces  (eval (quote (+ 3 5)))  (eval ‘(+ 3 5))
  • 7.
    Variables  Inicializaciones  (defvar *contador* 1)  Cambiando el valor a una variable  (setf *contador* 2)  Variables locales  (let ((contador 1)) (print contador))  (let ((contador 1)) (setf contador 2) (print contador))
  • 8.
    Condiciones  (if(= *a* *b*) (print “hola”) (print “adios”))  (when (= *a* *b*) (print “hola”)) – Equivalente a (if (= *a* *b*) (print “hola”))  (unless (= *a* *b*) (print “hola”)) – Equivalente a (if (not (= *a* *b*)) (print “hola”))  (Cond ((= *a* *b*) (print “uno”)) ((> *a* *b*) (print “dos”)) (t (print “tres”)))
  • 9.
    Relaciones de Igualdad  EQ (el más específico), compara si dos variables apuntan al mismo objeto.  (eq ‘(a b c) ‘(a b c)) NIL  (setf x 1) (setf y x) (eq x y) T  EQL como EQ pero también compara números si son del mismo tipo o para caracteres  (eql x y) T  (eql 3 3) T  (eql 3.0 3) NIL  EQUAL (El más general)  (equal ‘(a b c) ‘(a b c )) T  (equal 3.0 3) T  (equal “hola” “HOLA”) NIL  EQUALP Como EQUAL pero compara cadenas en mayúsculas y minúsculas  (equalp “hola” “HOLA”) T  Relaciones numéricas: = <, >, <=, >=
  • 10.
    Bucles  (dotimes(i 3) (print i))  (dolist (i ‘(0 1 2)) (print i))  (setf *i* 0) (loop (when (= *i* 3) (return)) (print *i*) (setf *i* (+ *i* 1)))
  • 11.
    Creación de Listas  (setf *lista* ‘(1 2 3 4 5))  (setf *lista* (list 1 2 3 4 5))
  • 12.
    Funciones Básicas deManejo de Listas  (car *lista*) = (first *lista*) = (nth 0 *lista*)  (rest *lista*) = (cdr *lista*)  (last *lista*) = (list (nth (- (length lista) 1) *lista*))  (push 8 *lista*)  (pop *lista*)  (cons 1 ‘(2 3 4 5))  (append ‘(1 2) ‘(3 4 5))  (member 1 ‘(3 4 1 5 6))  (sort ‘(3 2 1) ‘<)  (remove 1 ‘(3 4 1 5 6))  (length ‘(3 2 5))
  • 13.
    Declaración de Funcionesde Usuario  (defun nombre (args) “descripcion” (expresión)) – (defun mi-funcion (lista) “obtiene el primer elemento del argumento lista” (car lista))  Devuelven el valor de la última expresión
  • 14.
    Apply y Funcall  Permiten aplicar una función a un conjunto de datos – Apply (apply #’+ ‘(2 3)) – Funcall: (funcall #’+ 2 3)
  • 15.
    Mapcar  Permiteaplicar una función a cada uno de los elementos de una lista. (mapcar #’list ‘(1 2 3 4)) (mapcar #’+ ‘(1 2 3 4)’(10 20 30 40))
  • 16.
    Funciones Lambda Permite definir funciones en tiempo de ejecución – Muy útil para las funciones tipo map o para definir funciones de Test  (mapcar #’(lambda (x) (format t “El doble de ~a es ~a~&“ x (* 2 x))) ‘(1 2 3))  (member 2 ‘((1 2) (3 4) (5 6)) :test #’(lambda (x y) (equal x (second y))))
  • 17.
    Entrada / Salida  Lectura sobre entrada estándar  (setf *respuesta* (read))  Escritura sobre salida estándar  (print “Hola mundo”)  Salida con formato (format t literal argumentos) – El literal puede indicar: ~% nueva línea ~d número ~a carácter  (format t “el cuadrado de ~d es ~d ~&” 3 (* 3 3))  Abrir un fichero.  (setq fichero (open “nombre-fichero” :direction :input))  Escribir en un fichero.  (format fichero “el cuadrado de ~d es ~d ~&” 3 (* 3 3))  Cerrar fichero  (close fichero)
  • 18.
    Buenos hábitos deprogramación  Introducir comentarios – ; para comentar una línea – #| para comentar Varias líneas |#  Nombres de variables y funciones descriptivos  Funciones con pocas líneas y cortas  Utilice editor que resalte emparejado de paréntesis y con sangría automática – (i.e. emacs o xemacs)  Use cond en lugar de ifs anidados  Variables globales comiencen y acaben con * – *variable1*  Utilice lógica positiva al dar nombre a las funciones y predicados: que devuelvan t si es cierto. – (numberp 5)
  • 19.
    Libros  LISP: el lenguaje de la inteligencia artificial / A.A. Berk  AutoLISP versión 12 / José Antonio Tajadura Zapirain, Javier López Fernández  LISP / Patrick Henry Winston, Berthold Klaus Paul Horn  Common LISP : the language. Steele, Guy L.
  • 20.
    Web  ReferenciaFunciones Lisp – http://www.lispworks.com/documentation/HyperSpec/Front/index.htm