You are on page 1of 11

Lab.

Estructuras de lenguajes
Programa de ingeniera de sistemas
Universidad del Cauca
_____________________________________________________________

Prctica 9: Programacin funcional

Conceptos bsicos

Programacin funcional:

Funciones

Los lenguajes de programacin imperativa como Pascal y C se caracterizan por la existencia de


asignaciones ejecutadas consecutivamente. En la matemtica de los ltimos cuatrocientos aos
han sido muy importantes las funciones. Estas establecen la relacin entre los parmetros (la
entrada) y el resultado (la salida) de procesos definidos. El resultado de un clculo depende en
una u otra forma de los parmetros. Por esa razn, una funcin es una buena manera de
especificar un programa.

Esta es la base del estilo de programacin funcional. Un programa consiste en la definicin de


una o ms funciones. Para la ejecucin de un programa, se dan parmetros a una funcin y el
ordenador tiene que calcular el resultado.

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.

Racket es un lenguaje de programacin de la familia de Lisp y Scheme. Uno de sus principales


objetivos tras su diseo es posibilitar la creacin de nuevos lenguajes o dialectos. El lenguaje es
usado en una variedad de entornos tales como scripting, enseanza en ingeniera informtica o la
investigacin. La plataforma nos ofrece la herramienta DrRacket, un entorno de desarrollo
integrado programado en Racket (https://racket-lang.org/).
Lab. Estructuras de lenguajes
Programa de ingeniera de sistemas
Universidad del Cauca
_____________________________________________________________

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

Algunas primitivas sobre nmeros:

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

Las cadenas son secuencias finitas de caracteres.

Constructores de cadenas

Algunas operaciones con 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
_____________________________________________________________

Una expresin lambda define


Parmetros de la funcin
Cuerpo de la funcin

No define un nombre; lambda es una funcin sin nombre.

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:

Tambin se puede invocar a una funcin annima sin darle un nombre:

Salida:

La llamada a lambda crea un procedimiento y el parntesis a su izquierda lo invoca con el


parmetro 3.

Tambin es posible pasar una funcin lambda como parmetro de una funcin.

Definir nuevos elementos: define

Podemos usar define para darle un nombre (identificador, smbolo) a un valor.

La sintaxis de define es:

(define <smbolo> <expresin>)

define se evala as:

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:

(define (<nombre-funcion> <args>) <cuerpo>)

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.

Scheme permite abreviar la sintaxis de la definicin anterior:

Otros ejemplos:

Let

La forma especial let tiene la siguiente sintaxis:

(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.

Se crea una lista con un elemento:

Salida:

Se crea una lista con tres elementos:

Salida:

Estructuras de control

Las estructuras ms importantes de Scheme son el if y el cond para realizar una evaluacin
condicional.

if

(if <condicin> <exp-verdad> <exp-falso>)

Ejemplo 1:

Ejemplo 2:
Lab. Estructuras de lenguajes
Programa de ingeniera de sistemas
Universidad del Cauca
_____________________________________________________________

cond

La sintaxis de cond es la siguiente:

(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
_____________________________________________________________

write imprime la representacin de su argumento en la salida est ndar.

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.

Las frmulas de conversin son las siguientes:

C=(F32)5/9
F=(C9/5)+32

6. La media aritmtica de dos nmeros a y b es


media-aritmetica(a, b) = (a + b)/2
La media geomtrica es = (a, b) = a b
Definir procedimientos que representen estas operaciones.

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.

You might also like