A binding is the runtime manifestation of a variable
Ayer me levanté a las 3 am, huyendo de los zancudos. Claro que no perdí el tiempo, y continué mi aprendizaje de Lisp. Antes he hablado del tema (1, 2 y 3), me ha parecido interesante comenzar este aprendizaje por razones de trabajo, mis ideas para utilizarlo para un juego que diseñé hace un par de años, y, finalmente, porque es realmente divertido aprenderlo. Y hoy mis ánimos están como nunca ansioso de continuar. El aprendizaje de un lenguaje nuevo es fascinante. Es como visitar un nuevo país. Pero Lisp suele ser desalentador. Es raro. Muy raro. Casi complicado. Dicho inclusive por programadores expertos en assembler (programar en assembler es como resolver integrales). En realidad, ya he intentado aprender este lenguaje varias veces (incluyendo en la universidad hace 26 años) abandonando la aventura abrumado por las rarezas del lenguaje. Es como la manía de ciertos orientales de comer perro: no es solamente lo cuestionable que es comerse a un animal tan amigable y que sería capaz de hacer lo que estuviera a su alcance por nosotros, sino que al cocinarlo huele al infierno. Caminando por el mercado de Singapur (visité este país hace unos años cuando era feliz y no lo sabía) pasé cerca de un restaurante y tuve que correr para escapar del más espantoso olor que he olido en toda mi vida. Pues bien, Lisp es así: es raro y provoca salir corriendo.
Por ejemplo: en lenguaje C/C++ y en la mayoría de los lenguajes que descienden de Algol ‘==’ es igual. Dos expresiones iguales pueden ser comparadas con el operador ‘==’ y no hay mayor di
scusión sobre el tema. En Lisp hay 4 operadores para esto: eq, eql, equal, equalp. Y la diferencia entre ellas es la misma que hay entre “lo mismo” e “idéntico”: producen el mismo resultado pero se representan de forma distinta. ¿Otro ejemplo? Las convenciones. No sé si esto es algo así como obligado, pero en el libro Practical Common Lisp, podemos leer las normas para colocar comentarios: ;;;; es un comentario al principio del archivo, ;;; un comentario para un larga sección de código, ;; es un comentario para las siguientes líneas y ; aplica a la línea actual. ¿Raro? Sí, y también es raro la forma vehemente con que todos los autores prometen que nos olvidaremos y nos acostumbraremos rápidamente a la profusión de paréntesis. Porque en Lisp, vamos a utilizar paréntesis todo el tiempo.
Al parecer hay un resurgimiento del interés en Lisp, y en los blogs más conocidos aparece de vez en cuando algún comentario sobre el tema. Incluside una de las implementaciones de Lisp (SBCL, Steel Bank Common Lisp) es apenas 0.9 más lento que C++ y 0.2 más rápido que Java. Así que al menos en velocidad, ya Lisp no es tortuga que solía ser. Por lo demás, ya los argumentos a favor de lisp son tantos y con tal nivel de sofisticación que he perdido la capacidad de asombro. En el mencionado artículo podemos leer lo siguiente: “Any sufficiently complicated C or Fortran program contains an ad hoc, informally-specified, bug-ridden, slow implementation of half of Common Lisp.” [“Cualquier programa en C o Fortran suficientemente complicado contiene una implementación parcial de Common Lisp ad hoc, informalmente especificada, repleta de bugs, y lenta”]. Ver Greenspun’s Tenth and only rule. Esto se traduce que en realidad, cuando programamos sistemas complejos con lenguajes de programación tales como
C o C++, terminamos simulando e implementando las características que vienen en forma automática en Lisp. O, dicho en otra forma, Lisp es el lenguaje de programación más productivo para sistemas complejos.