Marzo 18, 2004

Belleza de código
Como tantas otras cosas, «conocí» a Paul Graham a través de Antonio. Paul Graham fue uno de los autores de Viaweb, una aplicación web para crear tiendas virtuales vendida a Yahoo! por una cantidad de plata con la que yo sólo puedo soñar ($49 millones en stock). Paul predica bastante sobre el lenguaje de programación Lisp, de cómo es, en su opinión, superior a todos los demás lenguajes.

Un comentario interesante de Paul tratando de demostrar este punto, es que el lenguaje de programación que uno prefiera «dicta la forma en que uno piensa sobre programas,» y narra un ejemplo personal de BASIC, donde el lenguaje inicialmente no soportaba recursividad. En la actualidad a Paul le parece difícil imaginar escribir programas sin usar recursividad, pero no lo extrañaba cuando usaba BASIC porque «pensaba en BASIC.» Lo mismo, concluye, sucede con las macros de Lisp, un concepto de «programas que escriben programas» que la mayoría de programadores no estamos familiarizados.

He leído ese y muchos otros artículos de Paul Graham varias veces. Tengo guardados algunos casi permanentemente en mi Palm, porque son inspiradores; pero no ha sido hasta hace unos días que me puse a leer su libro de ANSI Common Lisp (bueno, los capítulos 1 y 2) cuando me topé con este código de Lisp:

    (defun ask-number ()
      (format t "Please enter a number. ")
      (let ((val (read)))
        (if (numberp val)
            val
            (ask-number))))

Expresado lo más parecido posible en PHP:

    function ask-number () {
        echo "Please enter a number. ";
        $val = readline ();
        if (is_numeric ($val)) {
            echo $val;
        }
        else {
            ask-number ();
        }
    }

Lo curioso del caso es que si yo hubiese escrito esa función, no habría usado recursividad, sino un bucle while (!is_numeric ($val)). ¿Por qué? ¡No sé! Quizás realmente los lenguajes antiguos que he usado (empecé con BASIC en una Sinclair ZX81) realmente han dictado mi forma de pensar en los programas.

Cuando ví y entendí esas líneas de código de Lisp, lo primero que vino a mi mente fue: «¡Qué belleza de código!»

5 Replies to “Marzo 18, 2004”

  1. Creo que hacer eso en PHP, o en otro lenguaje derivado del C, nos llevaria a un stack overflow… creo que LISP maneja todo MUY distinto :)

  2. Si alguien fallase *demasiadas* veces, efectivamente nos llevaría a un overflow. Acabo de escribir un pequeño código recursivo y en la iteración 10903 (en el CLI) me ha salido \"Segmentation fault.\" :)

    De todos modos el punto es válido: qué otras limitaciones inconcientes tenemos en nuestro estilo de programación?
    He estado averiguando más y todo esto es fascinante. Hay tanto por aprender…

  3. El uso de funciones recursivas ademas de estar \"limitadas\" en muchos casos por el stack, es ineficiente. La manera \"correcta\" de hacer las cosas es de una manera iterativa. Esto es muy notorio por ejemplo con algoritmos de arboles, en donde la manera mas facil de hacerlo todo es con algoritmos recursivos, pero la manera eficiente (la que se implementa en C y la que manda papa Knuth) es con algoritmos iterativos.
    De todos modos nadie niega la belleza de un buen algoritmo recursivo ;-)

  4. Tabo: Haces que me sienta más bruto. :)

  5. Si tu te sientes bruto imaginate a mi tratando de leer eso, si con lo que escribio el miercoles drmad me mareo :S

Comments are closed.