Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Curso 20122013
Universidad de Sevilla
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.1
Introducci on a Lisp
x
Lambda c alculo
Lenguaje interpretado
u u
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.2
Introducci on a Lisp
x
x x
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.3
El usuario escribe una expresi on en el int erprete. El int erprete de Lisp reconoce la expresi on como la representaci on escrita de un objeto Lisp. El objeto es evaluado. Su valor es un objeto Lisp. El int erprete elige una representaci on escrita del valor obtenido. El int erprete escribe dicha representaci on.
u u u x
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.4
Introducci on a Lisp
x
Expresiones
> 1 1 > (+ 2 3) 5 > (+ (- 5 2) (* 3 3)) 12
Primeras observaciones:
u u u
Notaci on preja: funci on y argumentos. Par entesis. Expresiones anidadas Atomos y listas Sint acticamente simple
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.5
Introducci on a Lisp
x
Evaluaci on
> (+ (- 5 2) (* 3 3)) 12
Todo se eval ua
u
IA-I 20122013
Introducci on a Lisp
1.6
Introducci on a Lisp
x
La funci on quote:
> (quote (+ (- 5 2) (* 3 3))) (+ (- 5 2) (* 3 3)) > (+ (- 5 2) (* 3 3)) (+ (- 5 2) (* 3 3))
Otro ejemplo:
> x *** - EVAL: variable X has no value 1. Break> abort > x X > (esto (es) (una lista)) *** - EVAL: undefined function ESTO 1. Break> abort > (esto (es) (una lista)) (ESTO (ES) (UNA LISTA))
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.7
Introducci on a Lisp
x x
Algunas observaciones
u u u
IA-I 20122013
Introducci on a Lisp
x
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.9
Introducci on a Lisp
x
Valores vs. Modicaciones > (setf x (a b c d)) (A B C D) > (remove b x) (A C D) > x (A B C D) > (setf x (remove b x)) (A C D) > x (A C D)
Los programas se comportan como funciones en el sentido matem atico, dependiendo exclusivamente de sus datos de entrada Vericaci on formal
Cc Ia
Introducci on a Lisp 1.10
IA-I 20122013
At omicos:
u u u
No at omicos:
u u u u
Pares punteados y listas: (a . b), (a b c d e) Cadenas: "Buenos d as" Arrays: #(a b 0 nil), #3A(((0 0) (1 1) (2 2)) ((0 1) (1 2) (2 3))) Estructuras: #S(PERSONA :NOMBRE (ana maria) :ESTADO casado :CALLE (reina mercedes) :CIUDAD sevilla) Tablas hash
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.11
Pares y listas
x
Pares punteados:
u u
1
x
Listas
u u
Un tipo especial de par punteado (pero el tipo de dato no at omico m as com un) Ejemplo: la lista (1 2 3)
nil 1 2 3
Introducci on a Lisp 1.12
IA-I 20122013
Cc Ia
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.13
=> (C D E)
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.14
N umeros
x
Enteros: 14, 0, -7 Racionales: 4/5, -2/1 Coma otante: 4.634, -.543 Complejos: #C(3 46), #C(3.2, -5) > (/ 22 7) 22/7 > (round (/ 22 7)) 3 ; 1/7 > (float (/ 22 7)) 3.142857 > #c(2 0) 2
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.15
15 111 -3 70 3 2.5 1 8 4
Cc Ia
Introducci on a Lisp 1.16
() () NIL
Pero en general, cualquier elemento distinto de NIL tiene el valor l ogico verdadero.
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.17
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.18
Predicados de tipos
* (ATOM X) (atom 3) (atom hola) (atom (1 2 3)) * (SYMBOLP X) (symbolp a) (symbolp 3) * (NUMBERP X) (numberp 4) (numberp 3.4) (numberp (1)) * (CONSP X) (consp (1 . 2)) (consp nil) (consp (2 5)) => => => => => T T NIL T NIL
=> T => T => NIL => T => NIL => T => => NIL T
Introducci on a Lisp 1.19
Cc Ia
Predicados de igualdad
* (EQ X Y) (eq 3 3) (eq 3 3.0) (eq 3.0 3.0) (eq (first (a b c)) a) (eq (cons a (b c)) (a b c)) * (EQL X Y) (eql 3.0 3.0) (eql (cons a (b)) (cons a (b))) * (EQUAL X Y) (equal (cons a (b)) (cons a (b))) => => => => => => => => T NIL NIL T NIL T NIL T
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.20
Expresiones condicionales
x
Eval ua <condici on>: Si el valor es distinto de NIL (verdadero) devuelve el valor de <consecuencia>, en caso contrario devuelve el valor de <alternativa>.
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.21
Expresiones condicionales
x
<pares>: sucesi on de expresiones de la forma (<condicion><consecuencias>) siendo <consecuencias> una sucesi on de expresiones Lisp.
Eval ua los elemento <condicion> hasta que aparece un valor distinto de NIL (verdadero). Eval ua la correspondiente <consecuencias>. Eval ua cada una de las expresiones que la componen, devolviendo como el valor el u ltimo obtenido. Ejemplo: (cond ((< x 3) (format t "Es peque~ no") x) ((< x 5) (format t "Es mediano") (* x 2)) (t (* x x)))
Cc Ia
Introducci on a Lisp 1.22
IA-I 20122013
Condicionales
* (IF TEST ENTONCES [EN-CASO-CONTRARIO]) (if (> 2 1) 1 2) => 1 (if (> 1 2) 1) => NIL * (WHEN TEST E-1 ... E-N) (when (= 1 1) 1 2 3) (when (= 1 2) 1 2 3) => => 3 NIL
* (UNLESS TEST E-1 ... E-N) (unless (= 1 1) 1 2 3) => NIL (unless (= 1 2) 1 2 3) => 3 * (COND L-1 ... L-N) > (defun notas (n) (cond ((< n 5) suspenso) ((< n 7) aprobado) ((< n 9) notable) (t sobresaliente) )) NOTAS > (notas 8) NOTABLE
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.23
Operadores l ogicos
* (NOT X) (not (= (+ 1 1) 2)) (not (= (+ 1 1) 3)) * (OR E-1 ... E-N) (or nil 2 3) (or (eq a b) (eq a c)) * (AND E-1 ... E-N) (and 1 nil 3) (and 1 2 3) => => => => => => NIL T 2 NIL NIL 3
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.24
Pertenencia:
* (MEMBER E L [:TEST #PREDICADO]) (member x (a x b x c)) (member x (a (x) b)) (setf l ((a b) (c d))) (member (c d) l) (member 2.0 (1 2 3)) (member (c d) l :test #equal) (member 2.0 (1 2 3) :test #=) (member 2.0 (1 2 3) :test #<) => => => => => => => => (X B X C) NIL ((A B) (C D)) NIL NIL ((C D)) (2 3) (3)
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.25
Variables locales
* (LET ((VAR-1 VAL-1)...(VAR-M VAL-M)) E-1 ... E-N) (setf a 9 b 7) => 7 (let ((a 2)(b 3)) (+ a b)) => 5 (+ a b) => 16 (let ((x 2)(y (+ 1 x))) (+ x y)) => Error * (LET* ((VAR-1 VAL-1) ... (VAR-N VAL-N)) E-1 ... E-M) (let* ((x 2)(y (+ 1 x))) (+ x y)) => 5
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.26
Deniendo funciones
x
<nombre>: s mbolo al que se asocia la funci on. <par ametros>: sucesi on de s mbolos a los que se asignar a, temporalmente, el valor de los argumentos con los que se utilice la funci on. <documentaci on>: cadena en la que se describe la funci on. Es opcional. <cuerpo>: sucesi on de expresiones que se eval uan cuando se utiliza la funci on.
u u
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.27
Deniendo funciones
x
Ejemplo:
> (defun cuadrado (x) "Cuadrado de un numero" (* x x)) CUADRADO
Se eval ua cuadrado: funci on denida por el usuario. Se eval ua 4: 4 Se asocia al par ametro de cuadrado, x, el valor 4. Se eval ua la expresi on que compone el cuerpo de cuadrado: Se eval ua *: funci on primitiva de Lisp para calcular el producto. Se eval ua x: 4 Se eval ua x: 4 Se calcula el producto con argumentos 4 y 4: 16 Se elimina la asociaci on del par ametro.
Cc Ia
Introducci on a Lisp 1.28
IA-I 20122013
Deniciones recursivas
x
Recursi on
> (defun factorial (n) (if (= n 0) 1 (* n (factorial (- n 1))))) FACTORIAL > (factorial 3) 6
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.29
IA-I 20122013
Ejemplo:
(defun factorial (n) (if (= 0 n) 1 (* n (factorial (- n 1)))))
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.31
Listas lineales:
(defun f (... l ...) (if (endp l) <...> <... (first l) (f ... (rest l) ...) ...>))
Ejemplo:
(defun suma-lista (l) (if (endp l) 0 (+ (first l) (suma-lista (rest l)))))
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.32
(defun subconjunto (l1 l2) (if (endp l1) t (and (member (first l1) l2) (subconjunto (rest l1) l2))))
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.33
(defun elimina-uno (x l) (cond ((endp l) l) ((equal x (first l)) (rest l)) (t (cons (first l) (elimina-uno x (rest l))))))
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.34
(defun permutacion (l1 l2) (cond ((endp l1) (endp l2)) ((member (car l1) l2) (permutacion (rest l1) (elimina-uno (car l1) l2))) (t nil)))
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.35
(defun par-p (n) (cond ((= n 0) t) ((= n 1) nil) (t (impar-p (- n 1))))) (defun impar-p (n) (cond ((= n 0) nil) ((= n 1) t) (t (par-p (- n 1)))))
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.36
(defun comprime (l) (if (consp l) (comprime-aux (first l) 1 (rest l)) l)) (defun comprime-aux (x n l) (if (endp l) (list (n-elementos x n)) (let ((siguiente (car l))) (if (eql x siguiente) (comprime-aux x (+ n 1) (rest l)) (cons (n-elementos x n)(comprime-aux siguiente 1 (rest l))))))) (defun n-elementos (x n) (if (> n 1) (list n x) x))
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.37
Ejemplo:
(defun lista-cuadrados (ini fin) (do ((i ini (1+ i))) ((> i fin) terminado) (format t "~a ~a~%" i (* i i))))
u
La primera parte del do especica las variables del bucle (i en este caso), su valor inicial (ini) y c omo se actualiza en cada iteraci on (se incrementa en uno) La segunda parte especica la condici on de parada ((>i fin)) y lo que se devuelve (terminado) Finalmente, la expresi on nal especica qu e hacer en cada iteraci on (escribir una l nea con i y con el cuadrado de i)
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.38
Sesi on:
> (lista-cuadrados 1 5) 1 1 2 4 3 9 4 16 5 25 TERMINADO
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.39
Otro ejemplo:
;;; ;;; ;;; ;;; ;;; (ESPECULAR LISTA) > (especular (a b c c b a)) T > (especular (a b c g h h g c d a)) NIL
(defun especular (l) (let ((long (length l))) (and (evenp long) (do ((del 0 (1+ del)) (atr (1- long) (1- atr))) ((or (> del atr) (not (eq (nth del l) (nth atr l)))) (> del atr))))))
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.40
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.41
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.42
Ejemplos:
> (defun factor (x) (or (loop for i from 2 to (sqrt x) thereis (when (= (mod x i) 0) i)) x)) FACTOR > (factor 35) 5 > (defun es-primo (x) (= x (factor x))) ES-PRIMO > (es-primo 7) T > (es-primo 35) NIL > (loop for x from 2 to 100 count (es-primo x)) 25
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.43
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.44
Opciones iniciales:
(LOOP FOR <VARIABLE> FROM <INICIO> TO <FIN> ...) (LOOP FOR <VARIABLE> FROM <INICIO> TO <FIN> BY <INCREMENTO> ...) (LOOP FOR <VARIABLE> IN <LISTA> ...) (LOOP WHILE <CONDICION> ...) (LOOP UNTIL <CONDICION> ...)
Opciones centrales:
(LOOP ... WHEN <CONDICION> ...)
Opciones nales:
(LOOP (LOOP (LOOP (LOOP (LOOP (LOOP ... ... ... ... ... ... DO <EXPRESION>) COLLECT <EXPRESION>) APPEND <EXPRESION>) THEREIS <EXPRESION>) COUNT <EXPRESION>) SUMMING <EXPRESION>)
Cc Ia
Introducci on a Lisp 1.45
IA-I 20122013
Escritura
x
La funci on format:
(FORMAT DESTINO CADENA-DE-CONTROL X-1 ... X-N) > (format t "~&Linea 1 ~%Linea 2") Linea 1 Linea 2 NIL > (format t "~&El cuadrado de ~a es ~a" 3 (* 3 3)) El cuadrado de 3 es 9 NIL > (setf l (a b c)) (A B C) > (format t "~&La longitud de la lista ~a es ~a" l (length l)) La longitud de la lista (A B C) es 3 NIL
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.46
Escritura
x
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.47
Lectura
x
La funci on read
(READ) > (read) a A > (setf a (read)) 2 2 > a 2 > (* (+ (read) (read)) 3 4 7 > (read) (+ 2 3) (+ 2 3)
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.48
Lectura
x
Ejemplo:
(defun calcula-cuadrados () (loop (let ((aux (read))) (if (numberp aux) (format t "~&El cuadrado de ~a es ~a~%" aux (* aux aux)) (return fin)))))
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.49
Matrices
x
Creaci on:
(MAKE-ARRAY DIMENSIONES [:INITIAL-CONTENTS EXPRESION]) > (make-array (2 2)) #2A((NIL NIL) (NIL NIL)) > (make-array (2 2 1)) #3A(((NIL) (NIL)) ((NIL) (NIL))) > (make-array (2 2) :initial-element #2A((2 2) (2 2)) > (make-array (3 3) :initial-contents ((a b (1 2 (x y #2A((A B C) (1 2 3) (X Y Z)) > (setf *matriz* (make-array (3 3) :initial-contents ((a (1 (x #2A((A B C) (1 2 3) (X Y Z))
2) c) 3) z)))
b c) 2 3) y z))))
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.50
Matrices
x
Acceso:
(AREF MATRIZ INDICE-1 ... INDICE-N) > *matriz* #2A((A B C) (1 2 > (aref *matriz* A > (aref *matriz* 2 > (aref *matriz* Z 3) (X Y Z)) 0 0) 1 1) 2 2)
Modicaci on:
(SETF (AREF MATRIZ INDICE-1 ... INDICE-N) EXPRESION) > *matriz-2* #2A((1 2 3) (8 H 4) (7 6 5)) > (setf (aref *matriz-2* 1 2) h) H > (setf (aref *matriz-2* 1 1) 4) 4 > *matriz-2* #2A((A B C) (1 4 H) (X Y Z))
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.51
Matrices
x
Ejemplo
;;; ;;; ;;; ;;; ;;; ;;; ;;; ;;; (SUMA-COLUMNAS MATRIZ) > (setf mat (make-array (3 3) :initial-contents ((1 2 3) (4 5 6) (7 8 9)))) #2A((1 2 3) (4 5 6) (7 8 9)) > (suma-columnas mat) #(12 15 18)
(defun suma-columnas (a) (let* ((dim (array-dimensions a)) (f (first dim)) (c (second dim)) (res (make-array (list c)))) (loop for i from 0 to (- c 1) do (setf (aref res i) (loop for j from 0 to (- f 1) summing (aref a j i)))) res))
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.52
Estructuras (ejemplo)
> (defstruct persona (nombre nil) (estado casado) (calle nil) (ciudad Sevilla)) PERSONA > (setf ejemplo-1 (make-persona :nombre ana :calle (Reina Mercedes))) #S(PERSONA :NOMBRE ANA :ESTADO CASADO :CALLE (REINA MERCEDES) :CIUDAD SEVILLA) > (setf ejemplo-2 (make-persona :nombre pepe :ciudad Huelva)) #S(PERSONA :NOMBRE PEPE :ESTADO CASADO :CALLE NIL :CIUDAD HUELVA) > (persona-ciudad ejemplo-1) SEVILLA > (persona-nombre ejemplo-2) PEPE > (setf (persona-nombre ejemplo-1) (Ana Maria)) (ANA MARIA) > ejemplo-1 #S(PERSONA :NOMBRE (ANA MARIA) :ESTADO CASADO :CALLE (REINA MERCEDES) :CIUDAD SEVILLA)
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.53
Estructuras (ejemplo)
> (setf ejemplo-3 ejemplo-1) #S(PERSONA :NOMBRE (ANA MARIA) :ESTADO CASADO :CALLE (REINA MERCEDES) :CIUDAD SEVILLA) > (setf (persona-calle ejemplo-3) (tetuan)) (TETUAN) > ejemplo-3 #S(PERSONA :NOMBRE (ANA MARIA) :ESTADO CASADO :CALLE (TETUAN) :CIUDAD SEVILLA) > ejemplo-1 #S(PERSONA :NOMBRE (ANA MARIA) :ESTADO CASADO :CALLE (TETUAN) :CIUDAD SEVILLA) > (setf ejemplo-4 (copy-persona ejemplo-2)) #S(PERSONA :NOMBRE PEPE :ESTADO CASADO :CALLE NIL :CIUDAD HUELVA) > (setf (persona-ciudad ejemplo-4) cadiz) CADIZ > ejemplo-4 #S(PERSONA :NOMBRE PEPE :ESTADO CASADO :CALLE NIL :CIUDAD CADIZ) > ejemplo-2 #S(PERSONA :NOMBRE PEPE :ESTADO CASADO :CALLE NIL :CIUDAD HUELVA)
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.54
Estructuras
x
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.55
Estructuras (ejemplo)
> (setf *punto-1* (crea-punto :x 2 :y 3)) Punto de abcisa 2 y ordenada 3 > (coordenada-y *punto-1*) 3 > (setf (coordenada-y *punto-1*) 5) 5 > *punto-1* Punto de abcisa 2 y ordenada 5 > (punto-p *punto-1*) T > (punto-p (2 5)) NIL
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.56
Estructuras (ejemplo)
> (setf *punto-2* (copy-punto *punto-1*)) Punto de abcisa 2 y ordenada 5 > (equal *punto-1* *punto-2*) NIL > (equalp *punto-1* *punto-2*) T > (setf (coordenada-y *punto-2*) 3) 3 > *punto-2* Punto de abcisa 2 y ordenada 3 > (setf *punto-3* (crea-punto :y 3 :x 2)) Punto de abcisa 2 y ordenada 3 > (equalp *punto-2* *punto-3*) T
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.57
Las matrices no son tan exibles como las listas, pero permiten acceso r apido a sus componentes y ahorran espacio
u u
Ventajas: acceso y actualizaci on en tiempo constante Inconveniente: al crear un array necesitamos reservar el espacio de antemano
Una buena soluci on que permite utilizaci on din amica del espacio y acceso y actualizaciones r apidas son las tablas hash
u u
Las tablas hash almacenan asociaciones (clave,valor) La clave puede ser de cualquier tipo (n umeros, s mbolos, funciones,...)
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.58
Tablas hash
x
Creaci on (MAKE-HASH-TABLE):
> (setf *tabla* (make-hash-table)) #S(HASH-TABLE EQL)
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.59
Tablas hash
x
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.60
Argumentos opcionales
(defun factorial (n &optional (resultado 1)) (if (= n 0) resultado (factorial (- n 1) (* n resultado)))) (factorial 3) (factorial 3 4) => 6 => 24
Argumentos clave
(defun f (&key (x 1) (y 2)) (list x y)) (f :x 5 :y 3) (f :y 3 :x 5) (f :y 3) (f)
(5 (5 (1 (1
3) 3) 3) 2)
Introducci on a Lisp 1.61
IA-I 20122013
Valores de un s mbolo
x
Hemos visto:
DATOS EN LISP: - N umeros: 3, 2.5, - Cadenas: "hola", - S mbolos: adios, - Listas: (1 s 3), - Estructuras - Matrices, etc. 14.3, ... "el perro come", ... fun, fact, cuadrado, ... (1 (a (b))), ...
Expresadas mediante lambda (lambda (x) (* x x)) (lambda (x y) (cond ((> x 0) 1) ((< x 0) -1) (t 0)))
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.62
Valores de un s mbolo
x
Usualmente:
> (setf cuadrado 8) 8 > (defun cuadrado (x) (* x x)) CUADRADO
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.63
Evaluaci on en Lisp
u
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.64
Listas (E1 E2 ... En) * Se eval ua el VALOR FUNCIONAL de E1. - Si es un s mbolo: valor funcional. - Una lambda-expresi on: la funci on que representa. * Se eval uan E2 ... En (los argumentos) recursivamente. * Se "aplica" la funci on obtenida en primer lugar a los valores de los argumentos. Ejemplo: (cuadrado 4) => 16 (cuadrado cuadrado) => 64 ((lambda (m n) (+ m n)) (cuadrado 2) cuadrado)
=>
12
Quote (Exp): el valor representado por Exp Ejemplo: (cuadrado 4) => (cuadrado 4)
La funci on function (#Exp): valor funcional de Exp Ejemplos: #cuadrado => #<CLOSURE :LAMBDA (X) (* X X)> #(lambda (x) (* 2 x)) => #<CLOSURE :LAMBDA (X) (* 2 X)>
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.65
La funci on FUNCALL
(FUNCALL FN E-1 ... E-N) (funcall #+ 1 2 3) (funcall #cuadrado 4) (funcall #(lambda (x) (* 2 x)) 3) => 6 => 16 => 6
La funci on APPLY
(APPLY FN ARGS) (apply #+ (1 2 3)) (apply #max (4 5 7)) (apply #(lambda (x y) (* 2 x y)) (3 4)) => 6 => 7 => 24
Observaciones:
u u u
El primer argumento de funcall y de apply debe ser algo cuyo valor sea una funci on Uso de # para forzar a obtener el valor funcional A veces es necesario symbol-function
Cc Ia
Introducci on a Lisp 1.66
IA-I 20122013
* (REMOVE-IF-NOT PREDICADO L), (REMOVE-IF PREDICADO L) (remove-if-not #atom ((a) b (c) d)) (remove-if #atom ((a) b (c) d)) => (B C) => ((A) (C))
* (COUNT-IF PREDICADO L), (COUNT-IF-NOT PREDICADO L) (count-if #atom ((a) b (c) d e)) (count-if-not #atom ((a) b (c) d e)) => 3 => 2
* (FIND-IF PREDICADO L), (FIND-IF-NOT PREDICADO L) (find-if #atom ((a) b (c) d e)) (find-if-not #atom ((a) b (c) d e)) => B => (A)
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.67
* (FIND-IF PREDICADO LISTA), (FIND-IF-NOT PREDICADO LISTA) (find-if #atom ((a) b (c) d e)) (find-if-not #atom ((a) b (c) d e)) => B => (A)
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.68
* (SOME PREDICADO L), (SOME PREDICADO L1 ... LN) (some (some (some (some #atom ((1) a)) #atom ((1) (a))) #< (1 2) (1 3)) #< (1 2) (1 0)) => => => => T NIL T NIL
IA-I 20122013
Cc Ia
Introducci on a Lisp
1.69
Bibliograf a
x
Graham, P. ANSI Common Lisp (Prentice Hall, 1995). Norvig, P. Paradigms of Articial Intelligence Programming: Cases Studies in Common Lisp (Morgan Kaufmann, 1992). Seibel, P. Practical Common Lisp (Apress). http://www.gigamonkeys.com/book/ Steele, G.L. Common Lisp the Language, 2nd edition (D. P., 1990). http://www-2.cs.cmu.edu/afs/cs.cmu.edu/project/ai-repository/ai/html/cltl/cltl2.html Touretzky, D. Common Lisp: A Gentle Introduction to Symbolic Computation (Benjamin-Cummings Pub Co). http://www-cgi.cs.cmu.edu/afs/cs.cmu.edu/user/dst/www/LispBook/ Winston, P.R. y Horn, B.K. LISP (3a. ed.) (AddisonWesley, 1991).
Cc Ia
Introducci on a Lisp 1.70
IA-I 20122013