6 de julio de 2008

La venganza de los nerds (6 de 11)

Cuando Lisp apareció por primera vez, estas ideas estaban muy lejos de la práctica ordinaria de la programación, que era dictada mayoritariamente por el hardware disponible a finales de los 50. Con el tiempo, el lenguaje por omisión, encarnado en una sucesión de lenguajes populares, ha evolucionado gradualmente hacia Lisp. Las ideas 1-5 ahora están ampliamente difundidas. La número seis está empezando a aparecer en los lenguajes predominantes. Python tiene una forma de 7, aunque no parece que haya ninguna sintaxis para ella.

Mientras que para la número 8, esta podría ser la parte más interesante. Las ideas 8 y 9 sólo se convirtieron en parte de Lisp por accidente, porque Steve Russel implementó algo que McCarthy nunca había tenido intenciones de implementar. Sin embargo estas ideas resultan ser responsables tanto de la apariencia extraña de Lisp como de sus características más distintivas. Lisp se ve raro no tanto porque tenga una sintaxis rara sino porque no tiene sintaxis; expresas los programas directamente en los árboles de análisis sintáctico que se construyen tras bambalinas mientras que otros lenguajes son analizados, y estos árboles están hechos de listas, las cuales son las estructuras de datos de Lisp.

Expresar el lenguaje en sus propias estructuras de datos resulta ser una característica muy potente. Las ideas 8 y 9 juntas significan que puedes escribir programas que escriben programas. Eso puede sonar como una idea extravagante, pero es algo de todos los días en Lisp. La forma más común de hacerlo es con una cosa llamada macro.

El término "macro" no quiere decir en Lisp lo que en otros lenguajes. Una macro de Lisp puede ser cualquier cosa desde una abreviación hasta un compilador para un lenguaje nuevo. Si de verdad quieres entender Lisp, o simplemente expandir tus horizontes de programación, yo aprendería más acerca de las macros.

Las macros (en el sentido de Lisp) son aún, que yo sepa, únicos de Lisp. Esto es en parte porque para obtener las macros probablemente tendrías que hacer que tu lenguaje se viera tan raro como Lisp. También puede ser porque si le añades ese incremento final de potencia, ya no puedes declarar haber inventado un lenguaje nuevo, sino sólo un nuevo dialecto de Lisp.

Menciono esto sobre todo en tono de broma, pero es bastante cierto. Si defines un lenguaje que tiene car, cdr, cons, quote, cond, atom, eq, y una notación para funciones expresadas como listas, puedes construir el resto de Lisp con eso. Esa es de hecho la cualidad definitoria de Lisp: fue para lograr hacer esto así que McCarthy le dio a Lisp la forma que tiene.

No hay comentarios.: