La Singularidad Desnuda

Un universo impredecible de pensamientos y cavilaciones sobre ciencia, tecnología y otros conundros

Algoritmos exquisitos y programación deliciosa en el lenguaje CHEF

Posted by Carlos en febrero 6, 2007

Cuando se comienza a estudiar programación, suele ser muy socorrido recurrir a una analogía con una receta de cocina para dar una primera idea informal de lo que se entiende por algoritmo. Acto seguido, se dan definiciones más precisas, y uno se puede adentrar en las maravillas de las máquinas de Turing, y quién sabe si incluso del lambda-cálculo. Sin embargo, no sólo es una pena abandonar una analogía tan gratificante como la de la receta de cocina, sino que es algo de hecho innecesario. Mediante el lenguaje de programación CHEF, podemos dar nuestros primeros pasos en el delicioso mundo de la programación, a la vez que profundizamos en el arte milenario de la cocina.

CHEF es un lenguaje cuyos programas tienen la estructura de una receta de cocina. Los elementos básicos del lenguaje son los ingredientes, que tienen el rol de variables, y los recipientes (platos y cuencos), que actúan como estructuras de datos de tipo pila (aunque con algunas operaciones adicionales a las habituales en las mismas). Todo programa comienza con el nombre de la receta, y va seguido de la lista de ingredientes (declaración de variables, con posibilidad de indicar un valor inicial), y del método del preparación (cuerpo principal del algoritmo). Dentro de este último, disponemos de diferentes acciones para insertar/extraer ingredientes de los cuencos, o para alterar sus valores. Por ejemplo (traduzco las instrucciones del inglés):

  • Tomar <ingrediente> del refrigerador: lee un valor desde teclado, y lo almacena en ingrediente.
  • Poner <ingrediente> en el [n-ésimo] cuenco: introduce el valor del ingrediente en el tope de la pila indicada.
  • Añadir|Quitar <ingrediente> en el [n-ésimo] cuenco: suma|resta el valor del ingrediente al valor que haya en el tope de la pila indicada.
  • Combinar|Dividir <ingrediente> en el [n-ésimo] cuenco: multiplica|divide el valor del ingrediente al valor que haya en el tope de la pila indicada.
  • Vertir contenidos del [n-ésimo] cuenco en el [m-ésimo] plato: copia los elementos de una pila en otra.
  • Servir para k comensales: muestra en pantalla k valores, sacados en orden del primer plato, luego del segundo si hace falta, etc.

Además de estas operaciones básicas, existe una construcción iterativa general, que permite simular bucles de tipo whileendwhile. Concretamente, cuando nos encontramos una acción del tipo <verbo> <ingrediente> (donde el verbo puede ser cualquiera que no sea una de las palabras reservadas) comenzamos un bucle while condicionado a que el valor de ingrediente sea mayor que cero. El fin del bucle se marca con una acción del tipo <verbo> [<ingrediente>] hasta que esté <adjetivo>. Nuevamente, el verbo y el adjetivo (típicamente un participio) indicados son arbitrarios, y en caso de indicarse un ingrediente su valor se decrementa en uno antes de volver al comienzo del bucle.

Con estos elementos tenemos suficiente para confeccionar exquisitos programas, como el Suflé Hola Mundo (bueno como entrante), o el Fibonacci Al Dente (un segundo plato adecuado). Yo he optado por completar el menú con un postre casero que casa muy bien con lo anterior: Factorial con Fresas y Nata. He aquí la receta:

Factorial con Fresas y Nata.

Esta receta calcula el factorial del número que se le indique. Un postre perfecto que combina muy bien con Fibonacci al Dente, o con solomillo Ackermann.

Ingredientes.
1 kg fresas de Lepe
nata montada

Método.
Tomar nata montada del refrigerador.
Poner fresas de Lepe en el cuenco.
Agitar la nata montada.
Combinar nata montada en el cuenco.
Esparcir la nata montada hasta que esté homogénea.
Vertir contenido del cuenco en el plato.

Servir para un comensal.

Como puede apreciarse, el valor cuyo factorial queremos calcular se almacena en la nata montada. El bucle principal está entre “agitar la nata montada” (mientras su valor sea mayor que cero) y “esparcir la nata montada hasta …” (decrementar su valor y volver al comienzo del bucle). Este lenguaje nos abre infinitud de novedosos paradigmas de programación, como por ejemplo la programación mediterránea, una combinación estructurada de funciones de la huerta y variables de mar, regado con bucles de oliva y procedimientos tintos. La programación sigue siendo un delicioso arte. ¡Buen apetito!

Enviar a Blog Memes Enviar a del.icio.us Enviar a digg Enviar a fresqui Enviar a menéame

Anuncios

8 comentarios to “Algoritmos exquisitos y programación deliciosa en el lenguaje CHEF”

  1. Alf said

    Jeje, mola.

    Sólo por optimizar código, la sentencia “Agitar la nata montada” es superflua, ya que la nata montada ya viene… erm… montada 🙂

    A no ser que venga en spray, que es una guarrería 🙂

    Alf
    areino.com

  2. Carlos said

    Sí, estaba pensando en nata en spray 🙂 Si la teníamos ya preparada, podemos cambiar esa línea por “Destapar la nata montada”. Es lo bueno de la cocina, que nos apañamos con lo que tengamos 😉

  3. Genial,la verdad.Hace algùn tiempo,antes de dedicarme de lleno a los CGI,estudiè un poco programaciòn,empezando por Visual Basic y terminando en Prolog pasando por C++.La verdad,despuès de unos meses de estudio sin frutos decidì dejarlo por su enorme complejidad.Ahora veo que elegì los lenguajes equivocados,¡què pena de no haber sabido de la existencia de este exquisito,literalmente,lenguaje de programaciòn!No sè si realmente tiene utilidad pràctica pero desde luego para aprender los fundamentos del dificil arte de programar no tiene rival.

  4. JJ said

    Para n comensales, se repite n veces? O se puede paralelizar?

  5. Carlos said

    Me temo que es puramente secuencial, pero tiene llamada a procedimientos (bueno, recetas auxiliares), por lo que podemos definir una extensión Multi-CHEF, en la que la ejecución de las recetas auxiliares es asíncrona, y usar por ejemplo el horno o el refrigerador como zona de acceso común en exclusión mutua, para comunicación entre procesos.

    Para n comensales es más fácil añadir un par de detalles a la receta. Por ejemplo, para 4 personas:

    Ingredientes.

    4 hojas de yerbabuena
    4 barquillos

    Método.

    Esparcir la nata montada hasta que esté homogénea.
    Sacar fresas de Lepe del cuenco.
    Lavar yerbabuena.
    Poner fresas de Lepe en el cuenco.
    Decorar con yerbabuena hasta que esté de diseño.
    Vertir contenido del cuenco en el plato.
    Servir para tantos comensales como barquillos.

    Rico, rico.

  6. Programando recetas de cocina

    Cuando se comienza a estudiar programación, suele ser muy socorrido recurrir a una analogía con una receta de cocina para dar una primera idea informal de lo que se entiende por algoritmo. Luego vienen las estructuras de datos, los sistemas, compilad…

  7. la exelencia said

    exelentemente super bacano

  8. yisel said

    como yo puedo programar un sistema re recetas que utilice razonamiento basado en casos en python, como hago la base de casos

Sorry, the comment form is closed at this time.

 
A %d blogueros les gusta esto: