Está en la página 1de 117

 Describen que se debe calcular, sin explicitar el cómo.

 No existe la asignación ni el cambio de estado en un programa. Solo existen valores y


expresiones matemáticas que devuelven nuevos valores a partir de los declarados.
 Su control de flujo se basa en composición funcional, recursividad, técnicas de reescritura y
unificación.
 Tienen grados de pureza en sus variantes

 Se divide en dos:
 Programacion Logica: Prolog
 Programacion Funcional: Lisp, Scala, Haskell, Java….
 Modela un problema computacional como una colección de funciones matemáticas
 Sus programas se construyen mediante composición de funciones
 Una función hace su trabajo llamando a otras funciones cada vez mas simples hasta alcanzar las
primitivas del lenguaje

 Evaluación de expresiones funcionales, en lugar de ejecución de comandos

 Surge a principios de los 60´s para satisfacer necesidades en el campo de:


 Inteligencia Artificial
 Calculo simbólico
 Pruebas de teoremas
 Sistemas basados en reglas
 Procesamiento del lenguaje natural
 MODELO FUNCIONAL “PURO”
 Los cálculos se ven como una función matemática que hacen corresponder entradas y salidas
 No hay noción de posición de memoria, por ende, no hay necesidad de instrucción de
asignación
 Los ciclos se modelan a través de recursividad, porque no hay manera de incrementar o
disminuir el valor de una variable

 Casi todos los lenguajes que siguen este paradigma soportan el concepto de variable,
asignación y bucle.

 La mayoría de los lenguajes funcionales están basados en el


λ-cálculo
 El cálculo lambda (λ-cálculo) fue desarrollado por Alonzo Church en
la década del 30 con el objeto de dar una teoría general de las
funciones: definir función, aplicar función, recursión.

 Empleado como fundamento conceptual de los lenguajes de


programación, aportando

 Sintaxis básica
 Semántica para el concepto de función como proceso de
transformación de argumentos en resultados
 Medio para definir primitivas de programación
 Permite efectuar solo dos operaciones
 Definir funciones de un único argumento denotadas por

 x determina el parámetro o argumento formal y B representa el cuerpo de la función, f(x)=B

 Reducción. Aplicar alguna de las funciones definidas sobre un argumento real A.


 Sustituir las ocurrencias del argumento formal x en el cuerpo de la función B por el argumento real A
 Definición de una función

 La reducción indica que en la expresión x+5 se debe sustituir el valor de x por 3

 Cuando ya no es posible reducir una función se dice que se encuentra en estado


normal y se obtiene el valor de la función
 Hay 4 expresiones validas en calculo lambda:

 Constantes: 1,7, "juan" son expresiones validas

 Identificadores: x, y, z, etc.

 Abstracciones lambda: λx.e

 Aplicaciones: e1 e2
 La sintaxis del Cálculo Lambda ( CL ) es la siguiente:

Abstracción lambda Aplicación lambda

 Una expresión se define recursivamente

En esta sintaxis no existe el concepto de <nombre>


¿Qué implica esto?
El formalismo no tendrá primitivas, no nos permitirá emplear funciones con el concepto de módulos abstractos.
 Es la siguiente una expresión válida??

 e e1 e2  (λ id.e) c  (λ x. id ) 3  (λ x. x ) 3
 Tiene por objeto explicitar el concepto que representa el empleo de funciones
como medio de transformación de argumentos en resultados.

 A este formalismo lo denominamos CÁLCULO, ya que el mismo empleará


 un conjunto de axiomas, y
 reglas de inferencia (de la misma forma que lo utilizan los sistemas formales)

para representar el medio de transformación mencionado.

 El cálculo del resultado de una aplicación funcional será obtenido mediante la


generación de expresiones equivalentes por aplicación de ciertas reglas.
 Regla Beta

“el término que se obtiene de introducir N en lugar de x, toda vez que x ocurre libre
en M”
 Los conceptos que necesitamos a continuación son los de ocurrencia libre y ligada
de un variable.

 Definición. Una ocurrencia de la variable x en un término P es ligada sí y solo sí,


x ocurre en un subtérmino de P de la forma λx.M

 x e y ocurren ligadas ya que el término contiene los subtérminos


 (x y) ocurre 2 veces
 x ocurre 5 veces, 4 veces ligada y 1 vez libre
 y ocurre 3 veces, 2 veces ligada y 1 libre
 z ocurre una vez libre

 variables libres: x, y, z
 variables ligadas: x, y
 Para cada variable indique cuales son ocurrencias libres y cuales son ligadas

 Encuentre todas las ocurrencias libres de variables en las siguientes expresiones


 Definición: La variable x ocurre libre en un termino N solamente si:

 Definición. Si x ocurre libre al menos un vez en un término P, entonces x es una


variable libre de P.
 Regla Beta: Definición de sustitución

 1. En el caso en que M sea la variable a sustituir, la misma se realiza de la siguiente


forma:

 Ejemplos
 Regla Beta: Definición de sustitución

 2. En el caso en que M sea una variable, pero diferente de la sustituida, la misma se


realiza de la siguiente forma:

 Ejemplos:
 Regla Beta: Definición de sustitución

 3. En el caso en que M sea una aplicación funcional, la misma se realiza de la


siguiente forma:

 Ejs.
 Regla Beta: Definición de sustitución

 4. En el caso en que M sea una abstracción funcional, la misma se realiza de la


siguiente forma:

 Ejemplos:
 Regla Beta: Definición de sustitución

 5. En el caso en que M sea una abstracción funcional, la misma se realiza de la


siguiente forma:

 Ejemplos:
 Regla Beta: Definición de sustitución
 6. En el caso en que M sea una abstracción funcional, la misma se realiza de la
siguiente forma:
 Aplicación es asociativa hacia la izquierda L M N
((L M) N)

 λx. λ y.M se asocia hacia la derecha


(λx. (λ y.M))

 λx. λ y. x y z Una aplicación tiene precedencia sobre una abstracción


λx. λ y. ((x y) z)
 Renombrar variables ligadas para evitar variables duplicadas, al hacer
sustituciones beta.

=
 REDEX: La evaluación de una expresión se entiende como la aplicación de
una función a determinados argumentos efectivos.

 Definición: Un REDEX es un termino de la forma

Ejemplo:
 Definición:
 Una FORMA NORMAL es un término que no contiene ningún REDEX
 La forma normal de un término es única

 Si puede deducirse de las reglas del cálculo que P :=: Q y si Q está en forma
normal, se dice que Q ES FORMA NORMAL DE P

 No todos los métodos de reducción garantizan encontrar la forma normal de


un término
 Estrategia de evaluación de ORDEN NORMAL
 Consiste en reducir siempre primero el redex de más a la izquierda (aquel cuyo λ
aparece más a la izquierda)
 La estrategia de evaluación de orden normal aplicada a un término que tiene forma
normal termina por encontrarla en un número finito de reducciones

 Estrategia de evaluación de ORDEN APLICATIVO:


 Consiste en reducir primero los dos términos del redex antes de que la aplicación
que el denota sea reducida.
 A. (λx. (λy. (x y)) y) z

 B. (((λx. λy.(x y))(λy.y)) w)

 C. (λx. λy.xy)( λy.yz) z

 D. (λx.( λy.x)yλz.z)( λy.yz)


 Una expresión lambda especifica los parámetros y definición de una función, pero no su
nombre.

 Funciones Orden Superior


 Alto nivel de abstracción
 Tratadas como valores de primera clase: almacenadas en estructuras de datos, pasadas como
argumentos, devueltas como resultado.

g(f, [x1,x2,...])=[f(x1),f(x2),...]

g(Square,[2,3,5])=[4,9,25]
 Esto permite usar funciones simples para definir funciones mas complejas

 Una lista es un tipo de dato recursivo, la lista es una lista vacía(nil) o algo
pegado(cons) a una lista

nil es la lista vacia


lista[1] es cons 1 nil
lista [1,2,3] es cons 1(cons 2 (cons 3 nil)
 No existe la noción de posición de memoria, no hay instrucciones de asignación , por
tanto el programador se evita reservar y liberar memoria.
x=<expresion> NO ES UNA ASIGNACION , Se lee x se define como, o se
asocia con la expresión
 Cualquier lugar donde se tenga a x, se puede sustituir por la expresión
 No se puede definir a una variable mas de dos veces en el mismo programa

Un lenguaje funcional es puro si no existe el concepto de


operador de asignación.
 No se tienen efectos colaterales: No puede existir alguna variable externa que
afecte el resultado devuelto por una función.

 Transparencia Referencial: El resultado de una función solo depende de los


argumentos que se le pasan en la llamada
 Una función con referencia transparente o transparencia referencial tiene
como característica que dados los mismos parámetros para su aplicación,
siempre se obtiene el mismo resultado.

 En matemáticas, las funciones ofrecen transferencia referencial, seno(90)

 En programación: no hay transparencia referencial, Input() (salida depende de lo


tecleado por el usuario)

 Si se evalúa una expresión como (2ax+b)(2ax+c)

 Esta propiedad permite optimizaciones como la eliminación de


subexpresiones comunes
 No es necesario preocuparse por el flujo de control
 Las funciones se pueden evaluar en cualquier orden (Evaluación postergada)

 La recursión se utiliza como estructura de control primaria.


 Procesamiento de listas: Las listas se utilizan con recursión en sublistas como sustituto de
ciclos.

 Función pura: Siempre regresa el mismo valor dados los mismos argumentos, mas
cercano al concepto de función en matemáticas que la programación imperativa.
 Composición de funciones como parte del diseño modular de programas funcionales
 Mapeo entre objetos tomados de un conjunto de valores llamado dominio y
objetos en otro conjunto llamado codominio o rango.
 Ej. Función SIGNO que mapea el conjunto de los enteros a uno de los valores
en {pos, neg, cero}
 Dominio: Conjunto de los números enteros
 Rango: {pos, neg, cero}

Caracterización Caracterización
por extensión intencional

Función total: todos los


elementos del dominio
Función parcial:
algunos elementos del
dominio

 En los lenguajes fuertemente tipados como OCaml, se deben


especificar el rango y el dominio.
 En los tipados dinámicamente como LISP no es necesario
 Ej. suma/2, función que suma sus dos argumentos

 Dados dos enteros computara un tercero


 En LISP
Entradas: Parámetro Formal
ARGUMENTOS
Parámetro Actual :6

La salida se determina por


la regla que define a la
función

Salida: algún valor del rango de la


función
 Las cajas negras proveen bloques de construcción para un programa funcional.
Uniendo varias cajas es posible especificar operaciones mas sofisticadas.
 Composición de funciones: "ensamblar cajas"

Computa el máximo de dos


números enteros

Dominio: conjunto de pares de números enteros


Rango Conjunto de los enteros
max: int x int  int
Máximo de 3 números
max(1,7)  7

max3(a,b,c)=max(max(a,b),c)
max3(a,b,c)=max(max(a,b),c)
 Computa el signo del máximo de 4 números

signomax4(a, b, c, d) = signo(max(max3(a, b, c), d)).


 Tipado Fuerte y Estático
 Detección de Errores en tiempo de compilación

 Inferencia de Tipos
 De acuerdo a los operadores

 Polimorfismo
 Aumenta la reusabilidad, funciones aplicadas a tipos de datos diferentes.

 Orden de reducción Normal y Evaluación Perezosa


 La ejecución de un programa funcional consiste en el calculo de un valor (no
necesariamente individual), el proceso de dicho calculo se define como
evaluación de los datos de entrada
 IMPERATIVOS Aplicativo: Se reducen expresiones mas internas antes que las externas
(de izquierda a derecha)

 FUNCIONAL
 Normal o Voraz(eager): Se reducen las expresiones mas externas antes que las internas
(de izquierda a derecha)
 Perezosa (Lazy) : Las expresiones (argumentos formales, operaciones aritméticas) se
evalúan en el momento en que se requieren.
 Si F(x) multiplica a x por cero, no es necesario evaluar a x, puesto que cualquiera que sea su valor F(x)
siempre será cero
 Con un lenguaje imperativo se puede crear una lista infinita. Se crea un elemento, se le
asigna un valor y se invoca recursivamente la función para agregarle un nuevo valor a la
lista.

 Haskell:
crearLista = 1:crearLista
nombre función definición de la función
1 antepuesto al valor de crear lista
 Perezoso no intenta obtener el valor completo de crearLista, si le piden el decimo valor
de la lista calcula solo hasta ese valor.
 Si se trata de imprimir o calcular la suma de todos sus elementos, se cicla infinitamente.
 Cual seria el valor de la expresión
(+ 3 (* 2 4))
(+(* 5 4)(- 6 2))

 Lisp, Scheme, Clojure, Scala, Haskell, ML, OCAML, Erlang


 John McCarthy en 1959 junto con sus colaboradores en MIT
 LISP (List Processing - Procesamiento de Listas)

 Segundo lenguaje de programación de alto nivel

 Basado en el calculo Lambda de Alonso Church.

 Lenguaje expresivo: se pueden hacer muchas cosas con poco código.


 Funcional: Aplicar funciones a los datos

 Gran numero de dialectos: Common Lisp (Steele 90) y Scheme (Kelsey 98).
 Implementación de ANSI Common Lisp: Libre, GPL, incluye un interprete, un
compilador a bytecode CLISP.
 https://clisp.sourceforge.io/
 [5]> 10
 10

 El lector de Lisp, lee el texto 10 y crea un objeto Lisp que representa el numero 10.
 Este objeto es un objeto self-evaluating cuando se le pasa al Evaluador, se evalúa a si mismo.
 P imprime 10 en la línea.

 [5]> (+ 2 3)
 5
 Cualquier cosa entre paréntesis es una lista. Tres elementos: + 2 y 3
 Para evaluar una lista Lisp toma al primer elemento como el nombre de una función y el
resto de los elementos como argumentos de la función.
 [5]> (format t "Hola Mundo")
 Recibe varios argumentos, en este caso: a donde enviara la salida y una cadena.
t=>standard output

 Definición de una función


 [9]> (defun holamundo()(format t "Hola Mundo"))

 Llamada a la función
 [10]> (holamundo)
 Los elementos básicos son: listas y átomos.

 Átomos: números, caracteres, cadenas de caracteres, y nombres o símbolos

 Lista: Delimitada por paréntesis, puede contener cualquier numero de elementos separados
por espacios
 Los elementos de una lista pueden ser expresiones-s(átomos o listas anidadas)
 La lista “nil” es una lista nula que no tiene ningún elemento
 Cualquier secuencia de dígitos, pueden estar precedidos por (+ o -), contener
punto decimal o el carácter /, o terminar con un exponente
 Caracteres encerrados en comillas dobles. La diagonal inversa dentro de la
cadena incluye el carácter que va enseguida independientemente de lo que sea,
utilizada para comillas dobles y diagonal inversa.
 Los nombres se representan por objetos llamados simbolos

 Utilizan todos los caracteres del alfabeto A–Z, y los símbolos *, +, -, /, 1, 2, <, =, >,
and &.

 No pueden contener espacio en blanco


Lista de 4 elementos: dos símbolos, la lista vacía, y otra
lista que contiene dos símbolos y una cadena
 Preceder el átomo o la lista con una comilla simple

 Tambien se puede utilizar el símbolo quote

 (quote (* 2 3) )
 De uno a 4 símbolos ; dependiendo del alcance del comentario
 Se definen utilizando el macro DEFUN
(defun name (parameter*)
"Optional documentation string."
• Nombre: cualquier símbolo,
body-form*) generalmente caracteres
alfabéticos y guion medio.
• Cuerpo de la función: cualquier
(defun hello-world () numero de expresiones Lisp
(format t "hello, world")) • El valor de la ultima expresión se
regresa como valor de la función.

(defun verbose-sum (x y)
"Sum any two numbers after printing a message."
(format t "Summing ~d and ~d.~%" x y)
(+ x y))
 Se definen utilizando el macro DEFUN
(defun name (parameter*)
"Optional documentation string."
body-form*)
 PARAMETROS OPCIONALES
 Después de los nombres de los parámetros requeridos, escribir el símbolo
&optional seguido de los parámetros opcionales
(defun foo (a b &optional c d) (list a b c d))

Cuando se llame la función, los argumentos se irán ligando a los parámetros


requeridos. Una vez que los parámetros requerido tienen valor, se irán asignando los
valores restantes a los parámetros opcionales.

1 a 4 argumentos
 Si se requiere un valor diferente de NIL, se puede especificar un valor default para
parámetros opcionales.
(defun foo (a &optional (b 10)) (list a b))

 (foo 1 2) → (1 2)
 (foo 1) → (1 10)
 Estructurar datos: permite construir estructuras involucrando a átomos almacenados
en la memoria de datos
 Primiva de estructuración: Pares o conses ("cons cell"): Par de valores
 car es la referencia al primer elemento del par y cdr es la referencia al segundo elemento del
par
(car . cdr)

 Listas: anidación de pares


 car identifica a los elementos de la lista y cdr referencia al par que contiene al siguiente
elemento. El ultimo cdr referencia al átomo especial nil
(a . (b . (c . nil)))
(a b c)
Asocia un símbolo con un átomo "variable"
("foo" . c)

(a "foo" c (1 2))

("foo" c (1 2))

Asocia un símbolo con un átomo "variable"


Especificadores de Tipos
 Tipos Escalares: números,
caracteres, símbolos, etc
 Estructuras de Datos: listas,
vectores, cadenas.

 type-of : Funcion que regresa


el tipo de dato de un objeto
en especifico
 Cada variable se representa por un símbolo.

 Variables globales: Tienen valores permanentes y cambian solo si se especifica un


nuevo valor.
(defvar *x* 67)
(write *x*)

 Especificar un valor para un símbolo


(setq x 10) o (setq x 10 y 29 c 5)
 Variables locales

 Definidas dentro de un procedimiento

 Pueden ser definidas con setq o let


(let ((var1 val1) (var2 val2).. (varn valn))<s-expressions>)
 Si no se le da un valor inicial a la variable, lo asigna como nil

(let ((x 'a) (y 'b)(z 'c))


(let ((X 2) (Y 3)) (+ X Y))
(setq x 10)
(setq y 34.567) (defvar x 10)
(setq ch nil) (defvar y 34.567)
(defvar n 123.78)
(setq n 123.78)
(defvar ch nil)
10 (INTEGER 0 281474976710655)
(setq bg 11.0e+4) (defvar bg 11.0e+4)
34.567 SINGLE-FLOAT
(defvar r 124/2)
(setq r 124/2) 123.78 SINGLE-FLOAT
NIL NULL
(print (type-of x))
110000.0 SINGLE-FLOAT
(print x) (print (type-of y))
62 (INTEGER 0 281474976710655)
(print (type-of n))
(print y) (print (type-of ch))
(print n) (print (type-of bg))
(print (type-of r))
(print ch)
(print bg)
(print r)
No cambia su valor durante la ejecución del programa. Utilice defconstant.

(defconstant PI 3.141592)
(defun area-circle(rad)
(terpri)
(format t "Radius: ~5f" rad)
(format t "~%Area: ~10f" (* PI rad rad)))
Radius: 10.0
(area-circle 10) Area: 314.1592
 Aritméticos
 Comparación
 Lógicos
 A nivel de Bit
 Si A=10 y B=20

Operador Descripción Ejemplo


+ Suma dos operandos (+ A B) dará como resultado 30
- Resta el segundo operando del primero (- A B) dará como resultado -10
* Multiplica ambos operandos (* A B) dará como resultado 200
/ Divide numerador por denominador (/ B A) dará como resultado 2
mod,rem Operador modulo, residuo de la división (mod B A) dará como resultado 0

incf Operador de incremento (incf A 3) dará como resultado 13

decf Operador de decremento (decf A 4) dará como resultado 9


(write-line "Hola Mundo")
 a. Resuelva la siguiente operación
 b. Cual es el valor de C despues de evaluar la expression?
(SETQ A 3 C (+ (SETQ B 4) (+ A B)))
c. Defina la función cubo que recibe como parámetro um numero entero
d. Escribir una función P2 que calcule el valor del polinomio
Los parámetros se reciben en el orden A B C X
e. Definir una función F1 que calcule el promedio de las raíces de la ecuación. Los
parámetros se reciben en el orden A B C
Utilice let
 Si A=10 y B=20
Operador Descripción Ejemplo

= Verifica si los valores de los dos operandos (= A B) dará como resultado not true
son iguales
/= Verifica si los valores de los operandos son (/= A B) dará como resultado true
diferentes
> Mayor que (> A B) dará como resultado not true
< Menor que (< A B) dará como resultado true
>= Mayor o igual que (>= A B) dará como resultado not true

<= Menor o igual que (<= A B) dará como resultado true

max Regresa el máximo valor (max A B) dará como resultado 20

min Regresa el mínimo valor (min A B) dará como resultado 10


 (= 2 2.0 (+ 1 1)) True
 (= 1 2 3) Not True
 (/= 10 (+ 3 7)) Not True
 (/= 2 2.0 (+ 1 1)) Not True
 (/= 1 2 3) True
 (>= 4 3 3 2) True
 (>= 4 3 3 5) Not True
 A=NIL y B=5

Operador Descripción Ejemplo

and Cualquier numero de argumentos. (and A B) dará como


Se evalúan de izquierda a derecha. Si todos los resultado NIL
argumentos evalúan a no nulo, regresa el valor del
ultimo argumento, en caso contrario regresa NIL
or Cualquier numero de argumentos. (or A B) dará como
Se evalúan de izquierda a derecha hasta que alguno resultado 5
se evalué como no nulo, y se regresa el valor del
argumento, en caso contrario regresa NIL
not Toma un argumento y regresa no nulo si el argumento (not A) dará como
se evalua como NIL resultado no nulo
 A=60 y B=13

Operador Descripción Ejemplo

logand Regresa la operación AND lógica bit a bit de sus (logand A B) dará como
argumentos. Si no hay argumento regresa -1. resultado 12
logior Regresa la operación OR lógica bit a bit de sus (logior A B) dará como
argumentos. Si no hay argumento regresa 0 resultado 61

logxor Regresa la operación OR lógica bit a bit de sus (logxor A B) dará como
argumentos. Si no hay argumento regresa 0 resultado 49
lognor Regresa la operación NOT bit a bit de sus (lognor A B) dará como
argumentos. Si no hay argumento regresa -1 resultado -62
 (CAR L) devuelve el primer elemento de L, si L es una lista no vacía y NIL, en otro
caso.
 (CDR L) devuelve la lista formada por los elementos de L, excepto el primero, si L
es una lista no vacía y NIL, en otro caso.

 La función (C...R L) es una combinación de CAR y CDR hasta 4 niveles.


(CADR M)
(CADDR M)
 cond

 Se utiliza para verificar varias condiciones. Equivalente a los if anidados.

 Sintaxis

(cond (test1 action1)


(test2 action2)
....
(testn action n))

 Si ninguna de las condiciones se evalúa como true, entonces regresa NIL.


(setq a 10)
(cond ((> a 20)
(format t "~% a is greater than 20"))
(t (format t "~% value of a is ~d " a)))

El resultado sera: value of a is 10

La t en la segunda expresion asegura que se ejecute la ultima accion si no se ejecuta


ninguna otra
 if
(if (test-clause) (action1) (action2))
 Si la condición evalúa a true se ejecuta accion1, si evalúa a NIL la segunda acción es
ejecutada

(IF T 1 2)
(IF NIL 1 2)
(IF (= (SETQ A 3) 4) 1 0)
(IF (= A 3) 1 0)
(IF (= A 4) (+ A 2))
(IF (/ A 4) (- A 2))
 1. Diseñar expresiones para obtener dinero de:
(AGUA PAPEL DINERO TIERRA)
((AGUA PAPEL) DINERO TIERRA)
((AGUA PAPEL) (DINERO TIERRA))
(AGUA (PAPEL DINERO) TIERRA)
((AGUA PAPEL) ((DINERO) TIERRA))
 2. Definir las funciones SEGUNDO y TERCERO que devuelven el segundo o tercer elemento de una lista.
 3. Definir una función que verifique si la suma de sus dos primeros argumentos es mayor que el tercero.
Ej. Si recibe (1 4 3) debe regresar true.
 4. Investigue en que consisten las funciones NTH, NTHCDR, LAST y LENGTH utilizadas en listas y
muestre su funcionamiento en un código.
 5. Defina la función ULTIMO y PENULTIMO que da el ultimo o penúltimo elemento de una lista.
 6. Definir la función ABSOLUTO que devuelva el valor absoluto de un número
when

Evalua si la condicion es verdadera se ejecuta la accion, si evalua a nil no se evalua nada


y se regresa nil como resultado

(when (test-clause) (action1) )

(setq a 100)
(when (> a 20) a is greater than 20
(format t "~% a is greater than 20")) value of a is 100
(format t "~% value of a is ~d " a)
 Evalúa mutiples condiciones como cond. Evalua un "key form" y permite multiples acciones
basado en la evaluacion de la misma.
(case (keyform)
((key1) (action1 action2 ...) )
((key2) (action1 action2 ...) ) (setq day 4)
... (case day
(1 (format t "~% Monday"))
((keyn) (action1 action2 ...) )) (2 (format t "~% Tuesday"))
(3 (format t "~% Wednesday"))
(4 (format t "~% Thursday"))
(5 (format t "~% Friday"))
(6 (format t "~% Saturday"))
(7 (format t "~% Sunday"))
(otherwise (format t "~% Invalid")))
 loop

 Ejecuta algunas sentencias repetidamente hasta encontrar la sentencia return


(loop (s-expressions))
Sin la sentencia return, se produce un ciclo infinito

(setq a 10)
11
(loop
12
(setq a (+ a 1)) 13
(write a) 14
(terpri) 15
(when (> a 17) (return a))
16
17
) 18
 loop-for
 Permite:
 Definir variables para la iteración
 Especificar expresiones que terminen condicionalmente la iteración
 Especificar expresiones para realizar alguna tarea en cada iteración
 Especificar expresiones para realizar algún trabajo antes de salir del ciclo

(loop for x in '(tom dick harry)


(loop for loop-variable in <a list> do (format t " ~s" x)
do (action) )
) (loop for a from 10 to 20
do (print a)
)
(loop for loop-variable from value1 to value2
do (action) (loop for x from 1 to 20
)
if(evenp x)
do (print x)
)
(do ((x 0 (+ 2 x))
(y 20 ( - y 2)))
 do ((= x y)(- x y))
 Provee una forma estructurada de iteración (format t "~% x = ~d y = ~d" x y)
)
(do ((variable1 value1 updated-value1)
(variable2 value2 updated-value2)
x=0 y = 20
(variable3 value3 updated-value3)
x=2 y = 18
...)
x=4 y = 16
(test return-value) x=6 y = 14
(s-expressions) x=8 y = 12
)

 El valor inicial de cada variable se evalúa y se delimita al valor.


 updated-value es opcional, y especifica como se actualizaran los valores de las variables en cada iteración.
 Después de cada iteración, el test se evalúa si se evalúa a true, el valor de retorno se evalúa y se regresa.
 s-expresion es opcional y se ejecuta después de cada iteración, mientras que el valor de test regrese false.
 dotimes
Permite repetición para un numero fijo de iteraciones.

00
(dotimes (n 11) 11
24
(print n) (prin1 (* n n)) 39
) 4 16
5 25
6 36
7 49
8 64
9 81
10 100
 dolist

 Permite iteración a traves de los elementos de una lista


Number: 1 Square: 1
Number: 2 Square: 4
(dolist (n '(1 2 3 4 5 6 7 8 9)) Number: 3 Square: 9
(format t "~% Number: ~d Square: ~d" n (* n n)) Number: 4 Square: 16
Number: 5 Square: 25
) Number: 6 Square: 36
Number: 7 Square: 49
Number: 8 Square: 64
Number: 9 Square: 81
 (SETQ METALES '(HIERRO 7.8 COBALTO 8.9 NIQUEL 8.9))
 (SETQ GASES-NOBLES '(HELIO NEON ARGON)).

 Definir una función AYUDA-QUIMICA tal que al leer una expresión S devuelva:
 Una lista de la forma (METAL DE DENSIDAD N), si S es un metal de la lista METALES y N es la densidad de S.
 GAS-NOBLE, si S esta en la lista GASES-NOBLES.
 DESCONOCIDO, en otro caso.

 (AYUDA-QUIMICA 'COBALTO) ---> (METAL DE DENSIDAD 8.9)


 (AYUDA-QUIMICA 'HELIO) ---> GAS-NOBLE
 (AYUDA-QUIMICA 'ALUMINIO) ---> DESCONOCIDO

(DEFUN AYUDA-QUIMICA (S)


(COND ((MEMBER S METALES)
(LIST 'METAL 'DE 'DENSIDAD (CADR (MEMBER S METALES))))
((MEMBER S GASES-NOBLES) 'GAS-NOBLE)
(T 'DESCONOCIDO) ))
 7. Construya una función que utilice el operador and para determinar si los 5 números recibidos
como argumentos son impares. Puede utilizar la función (oddp numero) que comprueba si un
numero es impar.

 8. Construya una función que utilice los operadores or para determinar si de 5 números recibidos
como argumentos al menos uno es impar.

 9. Repita el ejercicio 7 utilizando ciclos para recorrer una lista y condicionales

 10. Defina una función llamada cuadrados que recibe dos parámetros M y N, y escriba los
cuadrados desde M hasta N.

 11. Escriba una función que calcule los primeros 11 elementos de la secuencia de Fibonacci.
 Una función que se llama a si misma se conoce como recursiva
 . Ej. La función verifica cuando algo es miembro de una lista

 El predicado eql verifica si sus dos argumentos son idénticos


 El factorial de un número n es el producto de todos los números enteros entre n y 1
Factorial(4)=4*3*2*1 Factorial(3)=3*2*1
Factorial(4)=4*Factorial(3)
En general, Factorial(n)=n*Factorial(n-1)
 (TRACE f1 ... fN) transforma las
definiciones de las funciones f1,..., fN
para que impriman sus argumentos y
valores. Devuelve T. Permite
depuración.
 (UNTRACE) devuelve la lista de todas
las funciones con TRACE y elimina el
efecto de TRACE de toda función que
lo tenga.
 Esta opción se debe escribir antes de
la llamada a la función.
 Definir la función producto, tal que: (PRODUCTO N1 N2) = N1 * N2

PRODUCTO(3 4)
 Definir la función COCIENTE tal que
(COCIENTE N1 N2) = Parte entera de N1/N2

Ej. (COCIENTE 7 2) = 3
 Definir la función RESTO tal que
(RESTO N1 N2) = Resto de dividir N1 entre N2.

Ej. (RESTO 7 2) =1
 Definir la función POTENCIA tal que

 Ej. (POTENCIA 2 3) = 8
 Por inducción sobre N2, use la relación
 Macro: Función que genera código Lisp, programa que genera programas.
 Produce una expresión que al ser evaluada produce un resultado.

(defmacro macro-name (parameter-list)


"Optional documentation string."
body-form)

(defmacro setTo10(num)
(setq num 10)(print num))

 “Siempre que encuentres una expresión de la forma (setTo10 num), conviertela en una expresión de la forma (setq num
10)(print num)
 y entonces procede a evaluar la expresión resultante”.

(setq x 25)
 Macro es una función Lisp que regresa expresiones
(print x)
(setTo10 x)
 La estructura mas básica en Lisp no es la lista, es cons.
 cons tiene dos partes (par ordenado, en matemáticas)
 Se puede acceder a sus partes con cad y cdr, o bien, con first y rest.

 CL-USER>(cons 'a 'b)


 (A . B)

 Una lista es una cadena de conses. El cdr del primer cons es un cons, donde el cdr de este cons
es tambien un cons, y asi sucesivamente, hasta que algun cdr es NIL, lo cual indica el fin de la
lista.

 CL-USER> (cons 'a (cons 'b (cons 'c (cons 'd nil))))
 (A B C D)
 Si el cdr es un cons, el punto y los parentesis desaparecen.

 CL-USER> (cons 1 (cons 3 4))


 (1 3 . 4) ;; en lugar de (1 . (3 . 4))

 Si el cdr es NIL, el punto y el cdr desaparecen

 CL-USER> (cons 42 nil)


 (42) ;; en lugar de (42 . NIL)

 Un cons es una estructura de datos abstracta que puede contener dos objetos.
 car y cdr serian referencias a objetos.
 Una lista como (A B C D) seria entonces.
 CL-USER> (list 1 2 3)
 (1 2 3)
CL-USER> (make-list 4 :initial-element 42)
(42 42 42 42)
 CL-USER> (list 1 2 (list 3 4))
CL-USER> (make-list 4)
 (1 2 (3 4)) (NIL NIL NIL NIL)

 CL-USER> (list* 1 2 (list 3 4))


 (1 2 3 4)
 Las listas son ligeras, fáciles de manejar y versátiles, pero...
 Si tiene referencia a una lista, la referencia solo es al inicio de la lista, es decir, a su primer
cons.
 Si desea saber el tamaño de la lista, debe atravesar toda la lista "cons por cons" hasta llegar al
final.
 No puede asegurar que la referencia que tiene hacia una lista es la adecuada, hasta haberla
recorrido por completo.
 Si una variable "apunta" a algo en la mitad de la lista, no hay manera de regresar y encontrar
el inicio de la lista.

 Listas simplemente enlazadas.


 Acceso aleatorio a los elementos de la lista es O(n)
 Para arreglos y tablas hash el acceso es O(1)
 1. Definir una función llamada ROTARI tal que al llamar(ROTARI L) sea la lista L con
su primer elemento colocado en el ultimo lugar
(ROTARI ‘(A B C D)  (B C D A)

2. Definir una función que coloque el primer elemento de una lista en tercer lugar.
 (RECORRE ’(A B C D)) ---> (B C A D)

3. Definir una función que determine si dos listas tienen los mismos elementos

También podría gustarte