Me gusta programar. No debería ser sorpresa para cualquiera que haya leído unos cuantos posts de este blog. Aunque empecé con BASIC —como casi todo el mundo— eventualmente aprendí cosas mejores. Visual Basic, lo mejor que hay para desarrollo rápido; C, maravilla de eficiencia; Bash, para scripts rápidos; PHP para desarrollo web; Java —sin comentarios—… entre otros.No voy a mentir diciendo que sé todo lo que hay que saber sobre cualquiera de esos lenguajes, pero sé manejarme en ellos. Y sé qué tienen de bueno o malo —ya sea limitaciones verdaderas (como la falta de recursividad en BASIC), o simples gustos (para elegir entre bash, ksh, etc.)—.
Un día leí lo que dijo Paul Graham, que no conoce uno lo que no tiene, si no sabe que existe. BASIC no tiene recursividad, y cuando lo usaba, nunca me dí cuenta: no conocía el concepto. Fue hasta que vi lo que podía hacer LISP que me dí cuenta de que, aunque sabía algo de programación… no sabía nada de programación
LISP es un lenguaje funcional: A diferencia de la mayoría, uno no escribe una serie de órdenes que la computadora sigue, y almacena sus valores, sino que declara funciones, las aplica a valores, y utiliza esos resultados (ojo, no porque no se suela hacer quiere decir que no se puede, pero esta otra forma suele ser mejor).
Por ejemplo, estuve resolviendo algunos problemas de Project Euler, un sitio que propone una serie de problemas matemáticos que (en teoría) son más fáciles de resolver con un programa que en papel (digo en teoría porque uno de los problemas —hallar el MCM entre todos los números del 1 al 20— se hacía en minutos en papel, pero tardaría bastante más en escribir un programa que lo resuelva), y empecé a hacerlo en C. Los primeros iban fácil: números chicos, funciones simples, cálculos rápidos. Eventualmente, llegué a uno que pedía la suma de los dígitos de 100!… y ese no es un número chico. C se volvió inútil.
Pero hace poco había instalado un intérprete de Common LISP (y una versión de Emacs, que aunque no es mi favorito, es casi obligatorio para programar en LISP), y lo probé. Escribí una función factorial rápidamente, y la probé. Hice la llamada, y apreté enter, listo para esperar unos segundos al menos, hasta que aparezca el resultado. Mi dedo apenas se despegó de la tecla, y el resultado —TODOS los dígitos— ya estaba en la pantalla. Escribí otra función, que sume los dígitos de un número, y la apliqué. La respuesta era correcta. Citando una frase típica: «me voló el marulo». Un número, que en C es prácticamente impensable (sin incluir bibliotecas externas, y usar funciones no-estándar, y tipos ajenos…), resuelto en milisegundos. Por dos funciones que sumaban 10 líneas. En un lenguaje de alto nivel.
LISP es increíble. Como dijera Eric S. Raymond, vale la pena aprender LISP, aunque no se lo use seguido, porque acerca a la iluminación.
powered by performancing firefox
Martes 6 de Marzo de 2007, 02:16
Increible! Me gusta tu blog, felicidades