Professional Documents
Culture Documents
Descripcin General
Lisp
= List Processing. Inventado por John McCarthy a finales de los 50s. Adecuado para IA por su habilidad para el procesamiento eficiente de informacin simblica. Lenguaje con sintaxis simple, casi nulo manejo de tipos y administracin dinmica de memoria.
Common Lisp
Existen
varios dialectos de Lisp: Franzlisp, Interlisp, Maclisp, Qlisp, Scheme, etc. Common Lisp es un intento por estandarizar el lenguaje y hacerlo ms portable y fcil de mantener. Por tanto, Common Lisp es el lenguaje a aprender. En adelante, al referirnos a Lisp, nos estaremos refiriendo a Common Lisp.
Estos
3 son los nicos objetos vlidos en Lisp. Son llamados expresiones simblicas o expresioness.
Todo nmero o secuencia de caracteres es un tomo. Es una secuencia de tomos y/o otras listas encerradas entre parntesis y separadas por uno o ms espacios.
Lista
Cadena
de caracteres:
tomos vlidos: esto-es-un-atomo - 345 bloque#1 - *var* Algunas listas vlidas: (1 2 3) - (a (a b) c d) (hijo Luis (Jos Susana)) - () Algunas cadenas de caracteres vlidas: Hoy es lunes - a b c d e 1 2 3 4 - teclea la fecha:
Expresiones-s
Toda
expresin-s es potencialmente un programa vlido en Lisp. programas pueden ser interpretados o compilados. un intrprete de Lisp, el programa fuente se examina en un lazo repetitivo llamado lazo leeevala-imprime (read-evaluate-print loop).
Los
En
>18 >
El
prompt > indica que el intrprete est listo para leer. El smbolo + es una funcin y 5, 6 y 7 son sus argumentos.
nombre de la funcin y sus argumentos se encierran entre parntesis para indicar al intrprete que debe evaluarla. lazo lee-evala-imprime del intrprete, lee la funcin con sus argumentos, la evala e imprime el valor que la funcin regresa (18, en el ejemplo anterior). imprime otra vez el prompt para indicar que est listo para la siguiente lectura.
El
Despus,
Funciones numricas
Las
Los
Ejemplos:
(+ (*
3 5 8 4) - (- 10 12) 2 3 4) - (/ 25 2)
Constantes importantes
Lisp
trata de avaluar todo, incluyendo los argumentos de una funcin. 3 tipos de elementos que son especiales porque siempre regresan su propio valor:
Existen
Los nmeros. La letra t (para verdadero). Nil (para falso). (Nil: palabra sueca para 0 o nada)
Nil es el nico objeto de Lisp que es a la vez un tomo y una lista (la lista vaca).
funcin se evala en el orden en que ocurre dentro de los parntesis de izquierda a derecha. Por ejemplo.
La
funcin a evaluar primero es la suma, pero su primer argumento es una multiplicacin. Por tanto, se debe evaluar primero la multiplicacin.
a su vez, el primer argumento de la multiplicacin es una divisin, por tanto, es necesario evaluar primero esta divisin. La divisin regresa el valor 1.8 a la multiplicacin, para dar (* 1.8 50). La multiplicacin regresa el valor 90 a la suma para dar (+ 90 32), que al ser evaluada regresa el valor 122.
funciones lgicas bsicas son NOT, AND y OR. NOT es la ms simple, toma un solo argumento y regresa T si el argumento se evala como nil y NIL si el argumento es diferente de nil.
funcin AND toma cualquier nmero de argumentos que se evalan de izquierda a derecha. Si todos los argumentos evalan diferente de nil, AND regresa el valor del ltimo argumento, de otra manera regresa NIL.
Funcin lgica OR
Los
argumentos del OR se evalan de izquierda a derecha hasta que uno de ellos evala diferente de nil, en cuyo caso regresa ese valor; de otra manera regresa NIL.
veces se quiere que un tomo o una lista sea considerada como un dato y no como una funcin que debe evaluarse. Para esto, se utiliza la marca de acotacin (quotation mark). Por ejemplo: '(a b c d) - '(+ 3 4 5)
En el primer caso se considera a la lista como el conjunto de datos a, b c y d, y no como la funcin a con argumentos b, c y d.
Un tomo no numrico, esto es, un tomo simblico, al que pueden asignarse o ligarse valores cambiantes. Funcin setq
Por ejemplo:
(setf var1 val1 var2 val2 ... varn valn) (setf a 10 b 15 c 12) ;a=10,b=15,c=12
Ejemplo:
(first lista) o (car lista): Regresa el primer tomo de lista (rest lista) o (cdr lista): Regresa el resto de lista
Por
ejemplo: (setq lst1 (a b c d)) (a b c d) ; crea lista (first lst1) a ; primer elemento (car lst1) a (rest lst1) (b c d) ; resto de la lista (cdr lst1) (b c d)
Por
ejemplo: (setq lst1 (a b c d)) (a b c d) ; crea lista (first lst1) a ; primer elemento (second lst1) b ; segundo elemento (fourth lst1) d ; cuarto elemento
Por
ejemplo: (setq lst1 (a b c d)) (a b c d) ; crea lista (nth 0 lst1) a ; elemento cero (nth 1 lst1) b ; elemento uno (nth 3 lst1) d ; elemento tres
Construccin de listas(1)
Otra
cons
utiliza 2 argumentos. Construye una nueva lista haciendo a elemento el primer miembro de lista. Por ejemplo: (cons a (b c)) (a b c) (cons (* 2 3) (1 2 3)) (6 1 2 3)
Construccin de listas(2)
Otra
Construye
una lista con miembros tomo1, tomo2, ..., tomo_n Toma cualquier nmero de argumentos. (list a b c d) (a b c d) (list a (b c d)) (a (b c d)) (list (+ 2 3) a b) (5 a b)
Funciones en general
La
Al
llamarse a un funcin los argumentos se evalan de izquierda a derecha (a menos que haya un marca de acotacin). Entonces la funcin se ejecuta usando los valores evaluados de sus argumentos. Ejemplo: (cons (car (a 2 )) (cdr (2 b c ))) (a b c)
Unin de 2 o ms listas en una: (append (a) (b c)) (a b c) last: Regresa una lista con el ltimo elemento: (last (a b c d)) (d) (last (a b c d) 2) (c d) butlast: Regresa la lista sin el ltimo elemento (butlast '(a b c d e)) (a b c d) (butlast '(a b c d e) 2) (a b c)
Regresa la lista en orden inverso: (reverse (a (b c) d e)) (e d (b c) a) sort: Ordenamiento de listas: (sort (2 4 1 5 3) #<) (1 2 3 4 5) (sort (2 4 1 5 3) #>) (5 4 3 2 1) (sort '(b c a) 'string-lessp) (a b c) (sort '(b c a) 'string-greaterp)(c b a) position: Posicin dentro de lista (position d (a b c d e f)) 3
Regresa el resto de la lista a partir de primer argumento: (member b (a b c d)) (b c d) set-difference: Regresa los elementos que resultan de restar dos listas.
length:
Regresa el nmero de elementos de nivel superior que hay en una lista. (length '(a b (c d))) 3
Elimina un elemento de una lista: (remove 100 '(1 2 100 3)) (1 2 3) union: Toma 2 listas como conjuntos y regresa la unin de esos 2 conjuntos:
(b d a c
intersection:
Regresa la interseccin de 2 listas consideradas como conjuntos: (intersection '(a b c) '(b c d))(b c)
Funcin Mdulo: (mod 26 3) 2 (mod -25 4) 3 rem: Funcin Residuo (remainder): (rem 26 3) 2 (rem -25 4) -1 abs: Valor absoluto: (abs -3.5) 3.5
Raz cuadrada (square root): (sqrt 25) 5 max y min: Mximo y mnimo: (max 3 5 9 3 1) 9 (min 3 5 9 3 1) 1 expt: Exponenciacin (expt 2 3) 8 (23) exp: en (exp 1) 2.7182817 (e1)
sin
: Incrementa en uno.
(1+ 5) 6
: Decrementa en uno.
(1- 5) 4 (gcd 15 10) 5
Predicados
Son
procedimientos que regresan t o nil. atom: es un tomo? numberp: es un nmero? listp: es una lista? symbolp: es un smbolo? zerop: es el nmero 0? plusp: es un nmero positivo? Otros: minusp, evenp, oddp, null.
Definicin de funciones
defun
Por
(inc5 3) 8
Lisp, las funciones pueden definirse con parmetros opcionales. Por ejemplo, sea la funcin raiz que regresa la raz cuadrada si es invocada con un solo parmetro y la raz n si es invocada con 2 parmetros.
Si al invocar raiz lo hacemos con un slo parmetro, este se asigna a x y n se vuelve nil.
(raiz 25) 5 {X=5, n=nil}
(raiz 25) 5
{X=5, n=2}
Entrada y salida
Las
bsicas:
- prin1 - terpri
Salida
con formato:
Ejemplo de read
read causa que el programa se detenga en espera de una entrada desde el teclado:
(+ 10 (read))
Cuando
el intrprete encuentra el read, espera por una entrada desde el teclado y la entrega a la funcin +.
print
print toma una cadena o un tomo como argumento, la despliega y regresa el argumento. print antecede su argumento con un retorno de carro y un avance de lnea y la sigue con un espacio (print Hola Mundo!)
prin1
prin1 funciona igual que print, pero no agrega ni el retorno de carro ni el avance de lnea al inicio ni el espacio al final. (prin1 hola)
hola hola
princ y terpri
princ es igual a prin1 slo que no imprime las comillas de la cadena de caracteres. (princ Hola Mundo!)
terpri no toma argumentos, slo introduce un retorno de carro y un avance de lnea y regresa nil.
format (1)
La
funcin format nos permite generar salidas mejor formadas que las operaciones de salida bsica. Su sintxis es: (format <destino> <cadena> arg1 arg2... argn)
Para
nuestros propsitos <destino> ser t, que es la salida por omisin, la pantalla de video.
format (2)
En
la <cadena> se introduce la cadena de caracteres de salida que se desee desplegar junto con algunas directivas de formato que especifican como deben representarse los argumentos arg1 ... argn.
Las
directivas de formato deben aparecer en el mismo orden que los argumentos a desplegar.
directivas de formato son precedidas por la tilde (~) para identificarlas como tales. Algunas directivas de formato son:
~A: El argumento se despliega como con princ ~S: El argumento se despliega como con prin1 ~D: El argumento debe ser entero y se despliega en decimal. ~F: El argumento debe ser un nmero y se despliega en decimal con punto flotante. ~%: Se despliega una nueva lnea
Ejemplo de format
;;; area-circulo2 ;;; Ilustra el uso de format (defun area-circulo2 () (terpri) (princ "Por favor, teclea el radio: ") (setq radio (read)) (format t "El area del circulo con radio ~4F es: ~7F~% radio (* pi radio radio)) )
Capturando la sesin
Lisp
nos provee un medio para capturar los resultados de una sesin interactiva:
(dribble archivo_salida.txt)
Esto
indica a Lisp que envie una copia de todo lo que aparece en pantalla al archivo archivo_salida.txt Para detener la captura:
(dribble)
Que
Editando programas
Para
editar un programa de Common Lisp se puede utilizar cualquier editor de texto que maneje texto plano. En Windows, podemos usar notepad En Linux, podemos usar vi o emacs. Por convencin, los archivos con cdigo de Common Lisp usan la extensin .lsp En Windows, desde una ventana de DOS, tecleamos notepad nombrearch.lsp
Cargando archivos
Para
cargar un archivo con cdigo Lisp, desde el prompt de Common Lisp tecleamos: (load nombrearch.lsp) En nuestro caso, tecleamos: (load z:/nombrearch.lsp). Esto supone que el archivo est almacenado en la raz de la unidad Z de Windows.
condicionales
Por
(if (> a b) a
Sintaxis:
Cada
prueba se evala hasta que una de ellas resulta diferente de nil, en cuyo caso se ejecutan las acciones asociadas y termina el cond.
Ejemplo de cond
(defun compara (a b) (cond((= a b) (princ A igual a B)) ((< a b) (princ A es menor que B)) (t (princ A es mayor que B)) ) ) (compara 4 5) A es menor que B (compara 4 4) A es igual a B (compara 5 4) A es mayor que B
(valor1 accion11 accion12 ... accion1n) (valor2 accion21 accion22 ... accion2m) : : : :
Ejemplo de case
(defun figura (forma r) (case forma (circulo (* pi r r)) (esfera (* 4 pi r r)) (otherwise (princ figura no conocida)) ) )
> (figura 'circulo 1) 3.141592... > (figura 'esfera 1) 12.5336.... > (figura 'cuadrado 2) figura no conocida
Funciones recursivas
Una
Factorial(n) en Lisp
;;; Factorial de n como una ;;; funcin recursiva (defun fact (x) (if (= x 0) 1 (* x (fact (1- x))) ) )
Esta es una funcin recursiva simple porque en su definicin se llama a s misma una sola vez.
1 M*Mn-1
En
Esta
funcin se llama dos veces a s misma, por lo que se dice que tiene recursin doble.
Fibonacci en Lisp
;;; Obtiene la funcin de Fibonacci ;;; con recursin doble. (defun fibonacci (n) (if (or (zerop n) (= n 1)) 1 (+ (fibonacci (1- n)) (fibonacci (- n 2)) ) ) )
Mapcar y Funcall
Mapcar es una instruccin que se utiliza para transformar listas. Sintxis: (mapcar #procedimiento lista) Mapcar genera una nueva lista con los elementos de lista afectados por procedimiento.
Nota: # es una abreviatura de function, que define el tomo siguiente como una funcin.
Ejemplos de mapcar
(mapcar #1+ (1 2 3)) (2 3 4) (mapcar #oddp (3 4 5)) (T NIL T) Suponiendo que inc5 est definida como: (defun inc5 (n) (+ n 5)) Entonces: (mapcar #inc5 (3 4 5)) (8 9 10)
Funcall
Funcall aplica el argumento inicial al valor de los otros argumentos. Sintxis:
Esta
Ejemplos de funcall
(funcall #1+ 1 2 3) 6 (funcall #append (a b) (c d))
(a b c d)
(funcall #member c (a b c d))
(c d)
(funcall #position d (a b c d e f))
Lazos e iteraciones
Existen
varias maneras de implementar lazos (loops) e iteraciones en Common Lisp. Algunas de ellas son:
Dolist
Dolist asigna a una variable los valores de los elementos de una lista en orden hasta que encuentra el fin de la lista. Sintxis:
Ejemplo:
Dotimes
Dotimes ejecuta las sentencias de su cuerpo n veces utilizando una variable como contador. Sintxis:
Ejemplo:
Do (1)
Esta
Mientras
Do (2)
Sintxis:
(do ( (var1 val_ini_1 actualiza_1) (var2 val_ini_2 actualiza_2)... (varn val_ini_n actualiza_n) ) (cond_termina valor_a_retornar) cuerpo ) Ejemplo: (do ((x 0 (1+ x))) ((> x 9) x) (print x) )
Loop
Loop realiza iteraciones sobre su cuerpo mientras no encuentre una instruccin (return). Sintxis:
(loop cuerpo)
Ejemplo:
(setq a 0) (loop (setq a (1+ a)) (print a) (when (> a 9) (return a)) )
Funciones lambda
Lambda
se utiliza cuando se desea crear una funcin temporal que no tendr un nombre. Patrick H. Winston sugiri sustituir, en nuestra imaginacin, la frase defun-annimo por lambda. Sintxis: (lambda (arg1 arg2 ... argn) cuerpo )
Ejemplo de lambda
El