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, – Strings: “Hola mundo” Otros: – arrays, vectores, tablas hash,… – Estructuras y Clases definidas por el usuario
Operadores Básicos Numéricos: – Suma (+ 1 2) ( ) – Resta (- 4 2) ( ) – Producto (* 3 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* ‘( )) (setf *lista* (list ))
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 ‘( )) (append ‘(1 2) ‘(3 4 5)) (member 1 ‘( )) (sort ‘(3 2 1) ‘<) (remove 1 ‘( )) (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 ‘( )) (mapcar #’+ ‘( )’( ))
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 –