200 likes | 325 Vues
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
E N D
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