Programación en LISP

91
Programación en LISP M.C. Juan Carlos Olivares Rojas

description

Programación en LISP. M.C. Juan Carlos Olivares Rojas. Agenda. Introducción Estructuras Operaciones Básicas Estructuras de Control Operaciones Matemáticas. Agenda. Funciones de Predicados Conjuntos y Relaciones Entradas y Salidas Implementación Respaldo y Recuperación. Introducción. - PowerPoint PPT Presentation

Transcript of Programación en LISP

Page 1: Programación en LISP

Programación en LISP

M.C. Juan Carlos Olivares Rojas

Page 2: Programación en LISP

Agenda

Introducción

Estructuras

Operaciones Básicas

Estructuras de Control

Operaciones Matemáticas

Page 3: Programación en LISP

Agenda

Funciones de Predicados

Conjuntos y Relaciones

Entradas y Salidas

Implementación

Respaldo y Recuperación

Page 4: Programación en LISP

Introducción• Creado por John McCartney en 1958. Viene del

acrónimo LISt Processing.

• Su paradigma de programación es la programación funcional por que todo se basa en el concepto de función.

• Su utilización en Inteligencia Artificial fue su gran éxito.

Page 5: Programación en LISP

Introducción

• Los Componentes Básicos de LISP son: átomos y listas.

• Los átomos pueden ser cualquier combinación de letras como CASA, ITM, PIEDRA, etc.

• Las listas son cualquier combinación de átomos encerrados entre paréntesis. Se pueden tener listas anidadas.

Page 6: Programación en LISP

Introducción• Ejemplos de listas:

• (Esta es una lista)• (EstaEsOtraLista)• (Lista (anidada))

• El vocablo “término” se utilizará para identificar un elemento de una lista ya sea átomo o sublista.

Page 7: Programación en LISP

Programación Funcional.•Está caracterizada por el principio funcional.

•El valor de una expresión depende sólo de los valores de sus subexpresiones, si las tiene.

•A+B es simplemente la suma de A y B.

•Se excluye las asignaciones

Page 8: Programación en LISP

Programación Funcional.•La mayoría de los lenguajes que lo implementan son impuros.

–Permiten asignaciones.

–Estilo de programación funcional.

•Los usuarios no deben preocuparse por el manejo de memoria.

•Ciertas operaciones asignan espacios de almacenamiento en el momento necesario.

Page 9: Programación en LISP

Programación Funcional•El almacenamiento que se vuelve inaccesible se libera.

–Recolección de basura.

•Las funciones son valores de primera clase.

•Tienen la misma jerarquía que cualquier otro valor.

Page 10: Programación en LISP

Programación Funcional•Puede ser el valor de una expresión.

•Puede pasarse como argumento.

•Puede colocarse en una estructura de datos.

•Tarea: Historia de los Lenguajes Funcionales.

Page 11: Programación en LISP

Programación Funcional.

•Lenguajes de Paradigma Funcional.–LISP–SCHEME–COMMON LISP–ML–Haskell

Page 12: Programación en LISP

Programación Funcional.•Una función matemática es un mapeo de miembros de un conjunto llamado dominio, hacia otro conjunto llamado contra-dominio.

•Toda definición de una función debe incluir de manera explicita o implícita:

–Dominio (Puede ser el resultado de un producto cruz)–Contra-dominio –Mapeo

Page 13: Programación en LISP

Programación Funcional.•Una función regresa solo un valor del contra-dominio para cada valor del dominio.

•Es función?

f x x

2f x x

Page 14: Programación en LISP

Programación Funcional.•El orden de evaluación de sus expresiones de mapeo, es controlada por expresiones recursivas y condicionales.

•Factorial.

1 x 1

1 x 1factorial x

x factorial x

Page 15: Programación en LISP

Programación Funcional.•Siempre definen los mismos valores, para un mismo conjunto de valores.

•Una función define un valor.

•No una serie de operaciones sobre valores de una memoria, para producir dicho valor.

•Esto implica que no hay variables en el sentido estricto de los lenguajes imperativos.

Page 16: Programación en LISP

Programación Funcional• Variables que representan una localidad de

memoria.

• Definición de funciones–Nombre.–Lista de parámetros entre paréntesis.–Expresión de mapeo.

• cubo(x)=x*x*x –Donde x es un número real.

Page 17: Programación en LISP

Programación Funcional.•Los lenguajes funcionales, no tienen una construcción explícita para ciclos tal como FOR, WHILE, etc.,

•Utilizan una técnica de programación conocida como recursividad.

•Aplicar una función como parte de la definición de esa misma función.

Page 18: Programación en LISP

Programación Funcional•Debe existir una condición terminal, con el objeto de que la función se bifurque hacia una resolución no recursiva en algún punto.

•De lo contrario, la función entra en un bucle infinito y nunca finaliza.

•Los lenguajes suelen ser tradicionalmente interpretados. Existen solo algunas opciones para compilar programas.

Page 19: Programación en LISP

Programación Funcional.•¿Por qué no todo mundo usa LISP?

•Sintaxis única.

•LISP Lots of Silly Parenthesis (Montón de paréntesis tontos)

•Los paréntesis permiten uniformar la sintaxis.

Page 20: Programación en LISP

Programación Funcional•Facilita la manipulación de los programas como datos.

•No existen los tipos de datos.

•Parte de los errores semánticos permanecen ocultos hasta la ejecución.

•Implantaciones iniciales ineficientes.

Page 21: Programación en LISP

Estructuras•Átomos.

–Símbolos de Lisp–Hacen la función de un identificador.–Las constantes numéricas también son átomos.

•Listas.–Estructura de datos.–Su procesamiento rara vez requiere inserciones o eliminaciones.

Page 22: Programación en LISP

Programación Funcional.•Listas.

– Se especifican delimitando sus elementos entre paréntesis.

•Listas simples.– Todos sus elementos son átomos.– (A B C D)

•Listas anidadas.– Sus elementos pueden ser átomos o sublistas.– (A (B C) D (E (F G)))

Page 23: Programación en LISP

Programación Funcional.•Listas.

•Internamente se implementan como listas simples enlazadas.

•Cada nodo contiene dos punteros y representa un elemento.

•Un nodo para un átomo contiene su primer puntero apuntando hacia alguna representación del átomo.

Page 24: Programación en LISP

Programación Funcional•Un nodo para una sublista contiene su primer puntero apuntando hacia el primer nodo de la sublista.

•En cualquier caso, el segundo puntero de un nodo, apunta hacia el nodo siguiente.

•A continuación se describen las listas y sus elementos de forma gráfica.

Page 25: Programación en LISP

Programación Funcional.•(A B C D)

•(A (B C) D (E (F G)))

A B C D

A

C

D

B C

C

EC

F G

Page 26: Programación en LISP

Programación Funcional

• ¿Cómo se usa LISP en IA?

• Se pueden codificar listas que pueden representarnos hechos, se pueden codificar reglas de inferencias en base a lista por lo que se puede hacer Programación Lógica.

• El motor de inferencia es implementado por el usuario pudiendo considerar más tipos de lógicas.

Page 27: Programación en LISP

Programación Funcional• El compilador/intérprete de LISP que se utilizará

en este curso es el newLisp.

• newLISP es un proyecto de software libre que cuya característica principal es que puede correr en ambientes gráficos y a su vez generar representaciones visuales.

Page 28: Programación en LISP

Operaciones Básicas• A continuación se describen las operaciones

básicas sobre LISP.

• La Evaluación de expresiones se realiza a través del Top Level que es muy semejante al shell visto en Prolog.

• Se escriben expresiones Lisp en el Top-Level, y el sistema despliega sus valores.

Page 29: Programación en LISP

Operaciones Básicas•El prompt > indica que Lisp está esperando a que una expresión sea escrita.

•La expresión es evaluada al pulsar enter.

> 1

1

>

Page 30: Programación en LISP

Operaciones Matemáticas• Las operaciones matemáticas son básicas para

poder implementar el paradigma funcional, a continuación se describen la forma de realizar operaciones matemáticas.

• Se desea evaluar la siguiente expresión aritmética: (+ 2 3)

> (+ 2 3)

5

>

Page 31: Programación en LISP

Operaciones Matemáticas• + es el operador / función.

• Los números 2 y 3 son sus argumentos.

• Notación prefija.

• Sumar tres parámetros en notación infija implica Utilizar dos veces el operador suma: 2+3+5

Page 32: Programación en LISP

Operaciones Matemáticas• Sumar tres parámetros en notación prefija

• Una sola llamada a la función, con tres parámetros: (+ 2 3 5)

• + es una función • (+ 2 3) es una llamada a la función.

> (+ 2 3 5)

10

>

Page 33: Programación en LISP

Operaciones Matemáticas• Cuando LISP evalúa una llamada a alguna función,

lo hace en dos pasos:

• Los argumentos de la llamada son evaluados de izquierda a derecha. En este caso los valores de los parámetros serán, 2 y 3 respectivamente.

• Los valores de los argumentos son pasados a la función nombrada por el operador. En este caso la función + que regresa 5.

Page 34: Programación en LISP

Operaciones Matemáticas• Uso del operador suma

> (+)0> (+ 2)2> (+ 2 3)5> (+ 2 3 5)10>

Page 35: Programación en LISP

Operaciones Matemáticas• Como los operadores pueden tomar un número

variable de argumentos, es necesario utilizar los paréntesis para indicar donde inicia y donde termina una expresión.

• Las expresiones pueden anidarse. Por ejemplo: (7-1)/(4-2)

> (/ (- 7 1)(- 4 2))3

Page 36: Programación en LISP

Operaciones Matemáticas• Si alguno de los argumentos es una llamada de

función, ésta será evaluada acorde a las reglas.

• Los argumentos de la llamada son evaluados de izquierda a derecha.

• Los valores de los argumentos son pasados a la función nombrada por el operador.

• Evaluar (/ (- 7 1) (- 4 2))

Page 37: Programación en LISP

Operaciones Matemáticas• Lisp evalúa el primer argumento de izquierda a

derecha (-7 1).

• 7 es evaluado como 7 y 1 como 1.

• Estos valores son pasados a la función - que regresa 6.

• El siguiente argumento (- 4 2) es evaluado.

Page 38: Programación en LISP

Operaciones Matemáticas• 4 es evaluado como 4 y 2 como 2.

• Estos valores son pasados a la función - que regresa 2.

• Los valores 6 y 2 son pasados a la función / que regresa 3.

Page 39: Programación en LISP

Operaciones Matemáticas• Un operador que no sigue la regla de evaluación

es: quote ( ’ )

• La regla de evaluación de quote es:

• No hacer nada, solo desplegar lo que el usuario tecleó.

• El operador quote es una forma de evitar que una expresión sea evaluada.

Page 40: Programación en LISP

Operaciones Matemáticas

• Tipos de átomos

• Entero: Se escribe como una secuencia de dígitos. Ejemplo: 256.

• Cadena : Secuencia de caracteres que se delimita por comillas. Ejemplo: “Carpe Diem”.

> (quote (+ 2 3))(+ 2 3)> ’(+ 2 3)(+ 2 3)

Page 41: Programación en LISP

Operaciones Matemáticas• Enteros y cadenas se evalúan a ellos mismos.

• Los símbolos son palabras. Normalmente se evalúan como si estuvieran escritos en mayúsculas, independientemente de como fueron tecleados.

• Los símbolos por lo general no evalúan a si mismos. Es necesario referirse a ellos.

> ’AmaroneAMARONE

Page 42: Programación en LISP

Operaciones Matemáticas• Las listas se representan como cero o más

elementos entre paréntesis.

• Los elementos pueden ser de cualquier tipo, incluidas las listas.

• Se debe usar quote con las listas, pues de otra forma Lisp las tomaría como una llamada a función.

Page 43: Programación en LISP

Operaciones Matemáticas• Un sólo quote protege a toda la expresión,

incluidas las expresiones en ella.

• Se puede construir listas usando el operador list que es una función, y por lo tanto, sus argumentos son evaluados.

> ’(Mis 2 "ciudades")(MIS 2 "CIUDADES")> ’(La lista (a b c) tiene 3 elementos)(LA LISTA (A B C) TIENE 3 ELEMENTOS)

Page 44: Programación en LISP

Operaciones Matemáticas• Estética minimalista y pragmática

• Los programas Lisp se representan como listas.

• Un programa Lisp puede generar código Lisp. Por eso es necesario quote.

> (list ’mis (+ 4 2) "colegas")(MIS 6 COLEGAS)

Page 45: Programación en LISP

Operaciones Matemáticas•Si una lista es precedida por el operador quote, la evaluación regresa la misma lista.

•En otro caso, la lista es evaluada como si fuese código.

> (list ’(+ 2 3) (+ 2 3))((+ 2 3) 5)

Page 46: Programación en LISP

Operaciones Matemáticas• En Lisp hay dos formas de representar la lista

vacía– Con un par de paréntesis – Con el símbolo NIL.

> ()NIL> NILNIL

Page 47: Programación en LISP

Operaciones Matemáticas• La función cons construye listas.

• Si su segundo argumento es una lista, regresa una nueva lista con el primer argumento agregado en el frente.

> (cons ’a ’(b c d))(A B C D)> (cons ’a (cons ’b nil))(A B)

Page 48: Programación en LISP

Operaciones Matemáticas• El segundo ejemplo es equivalente a:

• Las funciones primitivas para accesar los elementos de una lista son car y cdr.

• El car de una lista es su primer elemento (el más a la izquierda) .

> (list ’a ’b)(A B)

Page 49: Programación en LISP

Operaciones Matemáticas• El cdr es el resto de la lista (menos el primer

elemento).

• En realidad en newLisp car se hace a través de first y cdr a través de rest.

> (first '(a b c))a> (rest '(a b c))(b c)

Page 50: Programación en LISP

Estructuras de Control• Ya se mencionó que no existen en LISP

estructuras de control semejantes a los lenguajes procedimentales u orientado a objetos.

• Un Predicado es una función cuyo valor de regreso se interpreta como un valor de verdad (verdadero o falso).

• Es común que el símbolo de un predicado termine en p.

Page 51: Programación en LISP

Estructuras de Control•Como nil juega dos roles en Lisp, las funciones: null (lista vacía) y not (negación) hacen exactamente lo mismo:

•La condicional (if) Normalmente toma tres argumentos:

•una expresión a probar (test)

> (null nil)T> (not nil)T

Page 52: Programación en LISP

Estructuras de Control• una expresión entonces (then) que se evalua si

test es T.

• una expresión si no (else) que se evalua si test es NIL.

> (if (listp ’(a b c d))(+ 1 2)(+ 3 4))3> (if (listp 34)(+ 1 2)(+ 3 4))7

Page 53: Programación en LISP

Estructuras de Control• La condicional (if) es una macro no una función.

•Los argumentos de una función siempre se evalúan. If solo evalúa dos test y (then o else)

•Si bien el default para representar verdadero es T, todo excepto nil cuenta como verdadero en un contexto lógico:

> (if 27 1 2)1> (if nil 1 2)2

Page 54: Programación en LISP

Estructuras de Control• Los operadores lógicos (and, or) toman cualquier

número de argumentos, pero solo evalúan los necesarios para decidir que valor regresar.

• Si todos los argumentos son verdaderos (diferentes de nil), entonces and regresa el valor del último argumento.

> (and t (+ 1 2))3

Page 55: Programación en LISP

Estructuras de Control• Si uno de los argumentos de and es falso, ninguno

de los operadores siguientes es evaluado, y regresa nil.

• De manera similar, or se detiene en cuanto encuentra un elemento verdadero.

• Los operadores lógicos tampoco se consideran funciones, sino macros.

> (or nil nil (+ 1 2) nil)3

Page 56: Programación en LISP

Funciones de Predicados• Es posible definir nuevas funciones con defun que

toma normalmente tres argumentos:

• Un nombre.

• Una lista de parámetros

• Una o más expresiones que conforman el cuerpo de la función.

Page 57: Programación en LISP

Funciones• El primer argumento de define indica que el

nombre de la función definida será area.

• Los demás argumentos allí se muestran.

> (define (area base altura)(* base altura))(lambda (base altura) (* base altura))> (area 2 3)6

Page 58: Programación en LISP

Funciones• Cuando la variable representa el argumento de

una función, se conoce como parámetro.

• Un símbolo usado de esta forma se conoce como variable.

• El resto de la definición indica lo que se debe hacer para calcular el valor de la función.

Page 59: Programación en LISP

Funciones• Símbolos y listas deben protegerse con quote

para ser accedidos.

• Una lista debe protegerse porque de otra forma es procesada como si fuese código;.

• Un símbolo debe protegerse porque de otra forma es procesado como si fuese una variable.

Page 60: Programación en LISP

Funciones• La definición de una función corresponde a la

versión generalizada de una expresión Lisp.

• La siguiente expresión verifica si la suma de 1 y 4 es mayor que 3:

> (> (+ 1 4) 3)T

Page 61: Programación en LISP

Funciones• Substituyendo los números partículares por

variables, podemos definir una función que verifica si la suma de sus dos primeros argumentos es mayor que el tercero:

> (define (suma-mayor-que x y z)(> (+ x y) z))(lambda (x y z) (> (+ x y) z))> (suma-mayor-que 1 4 3)true

Page 62: Programación en LISP

Funciones• Lisp no distigue entre programa, procedimiento y

función.

• Si se desea considerar una función en partícular como main, es posible hacerlo, pero cualquier función puede ser llamada desde el top-level.

• Entre otras cosas, esto significa que posible probar un programa, pieza por pieza, conforme se va escribiendo.

Page 63: Programación en LISP

Funciones• Programación incremental (bottom-up).

• Las funciones que hemos definido hasta ahora, llaman a otras funciones para hacer una parte de sus cálculos. Por ejemplo: suma-mayor-que llama a las funciones + y >.

• Una función puede llamar a cualquier otra función, incluida ella misma.

Page 64: Programación en LISP

Funciones• Una función que se llama a si misma se conoce

como recursiva.

• Recordar que las funciones recursivas tienen definidas un paso base para poder salir de la recursión y un paso recursivo.

• A continuación se muestra un ejemplo de la función de Fibonnaci, definir la función multiplicación de manera recursiva (utilizando sumas).

Page 65: Programación en LISP

Funciones

; Función Fibonacci(define (fibonacci n)(if (< n 2)1(+ (fibonacci (- n 1))(fibonacci (- n 2)))))

>_ (fibonacci 10)89

Page 66: Programación en LISP

Funciones• Metáfora de la recursividad: procesos que se van

resolviendo.

• Un estudiante está interesado en Lisp.

• Va a la biblioteca y el proceso que utilizaría para examinar un documento es el siguiente:

• Obtener una copia del documento que le interesa.

Page 67: Programación en LISP

Funciones• Buscar en él la información relativa a Lisp.

• Si el documento menciona otros documentos que puede ser útiles, examinarlos.

• También se deben tomar en cuenta algunos factores no funcionales.

Page 68: Programación en LISP

Funciones• Uno de los operadores más comunes en Lisp es

let, que permite la creación de nuevas variables locales.

• Una expresión let tiene dos partes:

• Primero viene una lista de expresiones definiendo las nuevas variables locales, cada una de ellas con la forma (variable expresión).

> (let ((x 1)(y 2))(+ x y))3

Page 69: Programación en LISP

Funciones• Cada variable es inicializada con el valor que

regrese la expresión asociada a ella. En el ejemplo anterior se han creado dos variables, x e y, con los valores 1 y 2 respectivamente.

• Esas variables son válidas dentro del cuerpo de let.

Page 70: Programación en LISP

Funciones• Una expresión let tiene dos partes:

• Después de la lista de variables y valores, viene el cuerpo de let constituido por una serie de expresiones que son evaluadas en orden.

• En el ejemplo, sólo hay una llamada a +..

Page 71: Programación en LISP

Funciones• En newLisp el operador de asignación más común

es define.

• Se puede usar para asignar valores a cualquier tipo de variable.

> (define glob 2000)2000> (let ((n 10)) (define n 2) n)2

Page 72: Programación en LISP

Funciones• Cuando el primer argumento de setf es un

símbolo que no es el nombre de una variable local, se asume que se trata de una variable global.

> (define x ‘(a b c))(A B C)

Page 73: Programación en LISP

GUI en LISP(load (append (env "NEWLISPDIR") "/guiserver.lsp"))(gs:init)(gs:frame 'Mixer 200 200 400 300 "Mixer")(gs:set-resizable 'Mixer nil)(gs:set-border-layout 'Mixer)(gs:panel 'SliderPanel)(gs:set-grid-layout 'SliderPanel 3 1)(gs:panel 'RedPanel)(gs:panel 'GreenPanel)

Page 74: Programación en LISP

GUI en LISP(gs:panel 'BluePanel)(gs:label 'Red "Red" "left" 50 10 )(gs:label 'Green "Green" "left" 50 10 )(gs:label 'Blue "Blue" "left" 50 10 )(gs:slider 'RedSlider 'slider-handler "horizontal" 0 100 0)(gs:slider 'GreenSlider 'slider-handler "horizontal" 0 100 0)(gs:slider 'BlueSlider 'slider-handler "horizontal" 0 100 0)

Page 75: Programación en LISP

GUI en LISP(gs:label 'RedSliderStatus "0" "right" 50 10)(gs:label 'GreenSliderStatus "0" "right" 50 10)(gs:label 'BlueSliderStatus "0" "right" 50 10)(gs:add-to 'RedPanel 'Red 'RedSlider 'RedSliderStatus)(gs:add-to 'GreenPanel 'Green 'GreenSlider

'GreenSliderStatus)(gs:add-to 'BluePanel 'Blue 'BlueSlider 'BlueSliderStatus)(gs:add-to 'SliderPanel 'RedPanel 'GreenPanel

'BluePanel)

Page 76: Programación en LISP

GUI en LISP(gs:canvas 'Swatch)(gs:label 'Value "")(gs:set-font 'Value "Sans Serif" 16)(gs:add-to 'Mixer 'SliderPanel "north" 'Swatch "center"

'Value "south")(gs:set-visible 'Mixer true)(set 'red 0 'green 0 'blue 0)(gs:set-color 'Swatch (list red green blue))(gs:set-text 'Value (string (list red green blue)))

Page 77: Programación en LISP

GUI en LISP

(define (slider-handler id value)(cond((= id "MAIN:RedSlider")(set 'red (div value 100))(gs:set-text 'RedSliderStatus (string red)))((= id "MAIN:GreenSlider")(set 'green (div value 100))(gs:set-text 'GreenSliderStatus (string green)))

Page 78: Programación en LISP

GUI en LISP

((= id "MAIN:BlueSlider")(set 'blue (div value 100))(gs:set-text 'BlueSliderStatus (string blue))))(gs:set-color 'Swatch (list red green blue))(gs:set-text 'Value (string (list red green blue))))(gs:listen)

Page 79: Programación en LISP

GUI en LISP

;Uso de Bibliotecas de Windows(import "user32.dll" "MessageBoxA")

(MessageBoxA 0 "Hola Mundo!""Ejemplo de GUI" 0)

• Se pueden crear DLLs em lenguajes como C++ y poder utilizarlo em funciones más complejas.

Page 80: Programación en LISP

Entradas y Salidas• Para la definición de salidas se puede utilizar la

función print.

• La función time devuelve el tiempo en que tarda una función en evaluarse.

> (print (+ 2 3 4 1))1010

> (+ (* 2 3) (/ 3 2) 9)16

> (+ (print (* 2 3)) (print (/ 3 2)) (print 9))6 1 9 16

> time (promedio 1 2)0

Page 81: Programación en LISP

Entradas y Salidas• Se puede guardar programas con la extensión .lsp

para después poderlos ejecutar.

• A continuación se muestra una tabla con las principales funciones definidas en la mayoría de los dialectos de LISP.

> (load “f:/myfile.lisp")Ejecuta todo el script> (read-file “msgbox.lsp”)Visualiza todo el script

Page 82: Programación en LISP

Funcionesabs and Append apply assoc map

car cdr Close cond mapcdifference

(-)

defun (de,df) dm(macro) Eq equal eval explode

function gensym get getd go greaterp(gt)

intern lambda length list mapcan mapcar

lessp (It) expt fix fixp float floatp

mapcon maplist max min nconc not

numberp null open or princ print

prin1 prog progn put quote (') quotient (/)

read remainder remob remprop return reverse

rplaca rplacd set setq subst plus (+)

Terpri times (*) cons atom    

Page 83: Programación en LISP

Más de LISP

; imprimir los primeros 10 números de fibonacci(for (n 1 10)(println n " " (fibonacci n)))

(max 1.1 43 23 12 -1 53 4 32); ¿Cuanto da?

; ¿Qué hacen?(directory "/")(exit)

Page 84: Programación en LISP

Más de LISP

(set 'alphabet "abcdefghijklmnopqrstuvwxyz")(upper-case alphabet); ¿?

(set 'x (+ 2 2 )) ; ¿?(set 'y '(+ 2 2)) ; ¿?

(dotimes (c 10)(println c " por 3 es " (* c 3)))

Page 85: Programación en LISP

Más de LISP;Ejemplo de un switch(if (< x 0) (set 'a "imposible")(< x 10) (set 'a "pequeño")(< x 20) (set 'a "medio")(>= x 20) (set 'a "largo"))

Page 86: Programación en LISP

Más de LISP

(set 'counter 1)(dolist (i (sequence -5 5))(println "Elemento " counter ": " i)(inc 'counter))

(dolist (i (sequence -5 5))(println "Element " $idx ": " i))

Page 87: Programación en LISP

Más de LISP

;Switch(case n(1 (println "un"))(2 (println "deux"))(3 (println "trois"))(4 (println "quatre")))

(randomize (sequence 1 99))(dup 1 6)

Page 88: Programación en LISP

Más de LISP

(set 'L '(a b c (d e (f g) h i) j k)) (define (walk-tree tree) (cond ((= tree '()) true) ((atom? (first tree)) (println (first tree)) (walk-tree (rest tree))) (true (walk-tree (first tree)) (walk-tree (rest tree)))))

Page 89: Programación en LISP

LISP

(define (walk-tree tree)(dolist (elmnt tree)

(if (list? elmnt) (walk-tree elmnt) (println elmnt))))

>_ (walk-tree L)

Page 90: Programación en LISP

Bibliografía

• Rico, F. (2007) Programación Funcional, Material de la Materia Lenguajes de Programación, UVAQ Noviembre 2007.

• Montes, M. y Villaseñor L. (2008) Fundamentos de Inteligencia Artificial Métodos básicos de solución de problemas, Instituto Nacional de Astrofísica, Óptica y Electrónica, Puebla, México.

Page 91: Programación en LISP

¿Preguntas, dudas y comentarios?