Professional Documents
Culture Documents
Estructuras de lenguajes
Programa de ingeniera de sistemas
Universidad del Cauca
_____________________________________________________________
Conceptos bsicos
Programacin funcional:
Funciones
Lenguajes
LISP es un lenguaje de programacin creado por el profesor John McCarthy a finales de los aos
50. John McCarthy quiso desarrollar un lenguaje que mostrara la informacin estructurada en
listas. El nombre LISP deriva del "LISt Processing" (Proceso de LIStas). Las listas
encadenadas son una de las estructuras de datos importantes del Lisp, y el cdigo fuente del Lisp
en s mismo est compuesto de listas. Desde su inicio, el Lisp estaba estrechamente relacionado
con la comunidad de investigacin de la inteligencia artificial.
Los dos principales dialectos del Lisp usados para la programacin de propsitos generales hoy en
da son Common Lisp y Scheme. El Common Lisp es un superconjunto ampliado de los primeros
dialectos del Lisp, con un estndar de lenguaje grande incluyendo muchos tipos de datos y formas
sintcticas incorporados. El Scheme es un lenguaje interpretado de diseo ms minimalista, con
un conjunto mucho ms pequeo de caractersticas estndar.
SCHEME
Comentarios
Para agregar un comentario en Scheme se inicia con un punto y coma (;) y continan hasta el
final de la lnea.
Sintaxis bsica
Tipos de datos
A continuacin se revisan los tipos de datos primitivos de Scheme, as como algunas funciones
primitivas para trabajar con valores de esos tipos.
Booleanos
Nmeros
Caracteres
Lab. Estructuras de lenguajes
Programa de ingeniera de sistemas
Universidad del Cauca
_____________________________________________________________
Cadenas
Smbolos
Procedimientos
Parejas y listas
Boolenos
Un booleano es un valor de verdad, que puede ser verdadero o falso. En Scheme, tenemos los
smbolos #t y #f para expresar verdadero y falso respectivamente, pero en muchas operaciones
se considera que cualquier valor distinto de #f es verdadero.
Nmeros
La cantidad de tipos numricos que soporta Scheme es grande, incluyendo enteros de diferente
precisin, nmeros racionales, complejos e inexactos. Un nmero exacto es un objeto que
corresponde a un nmero que se ha obtenido mediante operaciones exactas y un nmero inexacto
es el resultado de una operacin que ha incluido redondeos u otras aproximaciones. Algunos tipos
de datos numricos:
number
complex
real
rational
integer
Salida:
Lab. Estructuras de lenguajes
Programa de ingeniera de sistemas
Universidad del Cauca
_____________________________________________________________
Otras primitivas:
(floor x) devuelve el entero mayor que sea menor o igual que x
(ceiling x) devuelve el entero menor que sea mayor o igual que x
(truncate x) devuelve el entero ms cercano a x cuyo valor absoluto no es mayor que el
valor absoluto de x
(round x) devuelve el entero ms cercano a x, redondeado
Caracteres
Ej.
Lab. Estructuras de lenguajes
Programa de ingeniera de sistemas
Universidad del Cauca
_____________________________________________________________
Cadenas
Constructores de cadenas
Comparadores de cadenas
Listas
Uno de los elementos fundamentales de Scheme, y de Lisp, son las listas. A continuacin se
muestran ejemplos de cmo definir, crear, recorrer y concatenar listas.
Uno de los conceptos ms importantes relacionados con las listas es el de lista vaca. La
comprobacin de si una lista es vaca con la funcin null? es el caso base de gran parte de
funciones recursivas que recorren listas.
Lambda
Lab. Estructuras de lenguajes
Programa de ingeniera de sistemas
Universidad del Cauca
_____________________________________________________________
La invocacin a la forma especial lambda construye una funcin annima en tiempo de ejecucin.
Por ejemplo, si ejecutamos una expresin lambda veremos que devuelve un procedimiento:
Salida:
Salida:
Tambin es posible pasar una funcin lambda como parmetro de una funcin.
1. Evaluar expresin
Lab. Estructuras de lenguajes
Programa de ingeniera de sistemas
Universidad del Cauca
_____________________________________________________________
2. Asociar el valor resultante de la evaluacin anterior con el smbolo
El otro uso de define es darle nombre a expresiones para poder reutilizarlas. La sintaxis para
definir una funcin con nombre es:
Se define una funcin con el nombre, argumentos y cuerpo dados. El cuerpo es una expresin de
Scheme. El resultado de evaluar la ltima expresin del c uerpo es el valor devuelto por la funcin.
Ejemplos:
En este ejemplo se le asigna un nombre global a una expresin lambda que calcula el cuadrado de
un nmero.
Otros ejemplos:
Let
(let
((<ident-1> <exp-1>)
...
(<ident-n> <exp-n>))
<cuerpo>)
Lab. Estructuras de lenguajes
Programa de ingeniera de sistemas
Universidad del Cauca
_____________________________________________________________
Esta forma especial permite definir unas variables locales, darles un valor y evaluar una expresin
con ese valor definido.
Ejemplo:
La utilizacin de let permite hacer los programas ms legibles, ya que podemos definir algunos
conceptos previos necesarios antes de la definicin del cuerpo de la funcin.
Parejas
Elemento fundamental de Scheme. Es un tipo compuesto formado por dos ele mentos (no
necesariamente del mismo tipo).
Ejemplo:
salida:
Las parejas pueden contener cualquier tipo de dato. Incluso otras parejas:
Lab. Estructuras de lenguajes
Programa de ingeniera de sistemas
Universidad del Cauca
_____________________________________________________________
Usando cons se genera una lista si el segundo argumento es una lista (El primer argumento puede
ser de cualquier tipo).
Ej.
Salida:
Salida:
Estructuras de control
Las estructuras ms importantes de Scheme son el if y el cond para realizar una evaluacin
condicional.
if
Ejemplo 1:
Ejemplo 2:
Lab. Estructuras de lenguajes
Programa de ingeniera de sistemas
Universidad del Cauca
_____________________________________________________________
cond
(cond
(<exp-cond-1> <exp-consec -1>)
(<exp-cond-2> <exp-consec -2>)
...
(else <exp-consec -else>))
Ejemplo:
Bucles
En programacin funcional pura no existe el concepto de bucle tan extendido en los lenguajes de
programacin imperativos. No es necesario si tenemos la recursin. Cualquier funcin en donde se
necesite repetir una sentencia un nmero de veces (o hasta que se cumpla una determinada
condicin) se puede expresar de forma recursiva.
Aunque en Scheme existe la forma especial (do ) que permite implementar un bucle se
recomienda usar la recursin.
Entrada / salida
Entrada:
read es una funcin que lee un valor desde la entrada estndar y lo retorna.
Ejemplo 1:
Ejemplo 2:
Lab. Estructuras de lenguajes
Programa de ingeniera de sistemas
Universidad del Cauca
_____________________________________________________________
Ejemplo:
EJERCICIOS
1. Defina una funcin lambda que reciba dos nmeros y retorne el mayor.
2. Use la expresin anterior para determinar el mayor de dos nmeros.
3. Use la expresin anterior para determinar el mayor de dos nmeros digitados por el
usuario.
4. Implemente una funcin llamada suma4 que recibe 4 nmeros y retorna su suma.
5. Definir una funcin llamada convertir-temperatura que permite realizar una conversin de
grados Fahrenheit a Centgrados o vicerversa. La funcin toma dos argumentos, el primero
ser un nmero que representa los grados y el segundo ser un carcter (F o C) que indica
la unidad de medida en la que estn expresados los grados.
C=(F32)5/9
F=(C9/5)+32
7. Implemente una funcin llamada sumalista que recibe una lista y retorna la suma de sus
elementos.
8. Implemente una funcin llamada mayor lista que recibe una lista de nmeros y retorna el
mayor elemento.