Programación funcional

Curso de programación funcional en Scheme/DrRacket

Última entrada

Éste blog fue creado con la intención de publicar y compartir información relacionada con las clases de programación funcional, curso que incidentalmente dicté en el 1er semestre de 2011. Dado que el tema no es de mi especialidad ( redes de datos ) no continué dictando la asignatura y por lo tanto no tengo interés inmediato en continuar alimentando este blog. Muchas gracias a mis estudiantes y otros lectores que aportaron con sus comentarios.

P.D.: Tengo muchos otros blogs en los que escribo regularmente, por ejemplo Informática++ sobre redes de datos, tecnología y sociedad. Docencia universitaria, sobre mi quehacer como profesor en la UTP.  Grupo de investigación Nyquist, en la que se publican actividades del grupo de investigación y actualmente voy a crear dos blogs más sobre Informática educativa y Comunicaciones para las asignaturas respectivas que he dictado durante los últimos años.

Paquetes de enseñanza en DrRacket/DrScheme

Los paquetes de enseñanza de DrRacket (antiguo drScheme) conocidos por su nombre en inglés teachpacks, son una estrategia didáctica para poder hacer cosas interesantes mientras se aprende a programar en Scheme. Las librerías han venido cambiando (como es de esperar) pero la mayoría de utilidades de la primera versión siguen siendo válidas en DrRacket. La siguiente entrada describe un poco cada una de las librerías como lo dice el manual oficial. Disfrútenlo.

[Read the rest of this entry…]

Estructuras y abstración de datos

Todos los lenguajes prevén la manipulación de datos de ciertos tipos y definen no sólo la forma en que éste los almacena en la memoria sino las operaciones por defecto que una aplicación puede hacer sobre ellos. Sin embargo, para que un programa sea robusto en su significado, fácil de comprender y eficaz en su ejecución, usualmente es necesario crear tipos de datos propios. A continuación describo cómo se crean tipos de datos nuevos en Scheme y muestro algunos ejemplos de su uso en DrRacket. Disfrútenlo.

[Read the rest of this entry…]

Programa de dibujo

Crear estructuras parametrizadas para las figuras geométricas:

  • rectangulo
  • círculo
  • disco (dos círculos concéntricos)
  • triángulo
  • cruz
  • raya

De las figuras listadas, excepto por el círculo, todas se pueden ver como polígonos (no necesariamente cerrados). Hacer una función que dibuje polígonos, recibiendo una lista de puntos y dibujando rayas entre todos los puntos sucesivos.

A partir de las estructuras y funciones mencionadas, crear funciones individuales que dibujen cada una de las figuras.

Crear una función maestra que dibuje una figura de cualquier tipo (de los definidos previamente).

Lambda en scheme

La base fundamental de Scheme y los lenguajes que obedecen el paradigma funcional es el cálculo lambda. Esta entrada no es sobre ese tema, que es un tema avanzado que formaliza la solución de problemas mediante la secuenciación y composición de funciones, sino sobre cómo es que Scheme usa éste concepto y en especial cómo es que éste lenguaje funcional puede usar funciones como un dato primitivo adicional. Disfrútenlo.
[Read the rest of this entry…]

Recursividad y gráficos

En la última clase hicimos una función trivial para recorrer una lista de polígonos y dibujarlos en un lienzo. A continuación les propongo un pequeño reto de construcción de programas de dibujo simple. Disfrútenlo.

[Read the rest of this entry…]

Ejemplos de funciones recursivas

En la entrada anterior, mostré un poco la relación que existe entre listas y recursividad. Ahora voy a describir un poco más esa relación haciendo una serie de ejemplos tomados del conocido libro How to design programs. Disfrútenlos.
[Read the rest of this entry…]

Taller de recursividad

A continuación publico el taller que puse en la clase del Jueves 14 de Abr./2011 para entregar el Sábado en la media noche (23:59hrs).

Introducción a la recursividad

En las primeras clases de la materia de Programación I, en la que vemos el paradigma de programación funcional, hemos explorado diferentes tipos de datos  y operaciones con ellos. Mediante ese análisis hemos llegado a explorar conceptos importantes como la composición de funciones y elementos estructurales del lenguaje Scheme como la declaración de funciones, reglas de contexto léxico (local) y finalmente declaración y uso de estructuras.

Las estructuras resuelven la necesidad de crear nuevos tipos de datos que en sí mismos están compuestos por varios componentes de cualquier otro tipo. Sin embargo, todavía no sabemos cómo manejar un conjunto de datos con el mismo patrón, por ejemplo, cómo se resolvería un llamado de la siguiente forma:

(transferir estudiantes profesor)

en la que estudiantes es un conjunto de datos de tipo estudiante, estructura definida de la siguiente manera:

(define-struct estudiante (nombre apellido profesor nota))

El llamado en cuestión, debería efectuar su acción sobre cada uno de los datos del conjunto, por ejemplo cambiarles a todos el profesor por lo que contenga el parámetro del mismo nombre.

Otra cosa que todavía no sabemos hacer es devolver en un sólo llamado más de un valor. Scheme tiene como característica fundamental que todas las expresiones se convierten en un sólo valor. ¿Qué pasa si yo quisiera que una función devolviera dos objetos de naturalezas totalmente diferentes, por ejemplo, que la operación de transferencia del ejemplo devolviera el conjunto de estudiantes modificados y simultáneamente true o false si la operación tuvo éxito o no?. Aunque alguien podría responder que creando una nueva estructura con los componentes que queremos retornar, esa solución viola un poco el propósito de una estructura, que es un dato cuyos elementos están estrechamente relacionados.

La solución a éste tipo de problemas es un tipo de datos muy general llamado listas. Para resolver los problemas anteriores la solución sería que la función transferir de los párrafos anteriores recibiera una lista de estudiantes y devolviera una lista compuesta por el grupo de estudiantes modificados y un valor booleano. A continuación se elaborará el concepto de listas y su uso, explorando de paso el concepto de recursividad. Disfrútenlo.
[Read the rest of this entry…]

Depurar Scheme, Parte I

Los depuradores (debugger en inglés) son una de las herramientas más útiles para los programadores. En la programación de aplicaciones complejas, a veces no es fácil comprender cómo funciona el programa y cuando falla no se sabe bien qué pasa en la memoria del computador o qué llamado hace que el programa falle o en general por qué falló. En tales condiciones vendría de perlas saber cómo se ejecuta cada operación en el programa, ver qué valor tienen las variables y qué pasa antes y después de una instrucción. Ésto es lo que hacen los depuradores: mostrar paso a paso la ejecución del programa mostrando a qué parte del programa salta la ejecución y qué valores van quedando en la memoria. A continuación voy a describir cómo usar el depurador de DrRacket (sucesor de DrScheme) para estudiantes principiantes o intermedios. Disfrútenlo.
[Read the rest of this entry…]