LO QUE HIZO DIFERENTE A LISP


Diciembre 2001 (revisión Mayo 2002)

(Este artículo surgió como respuesta a algunas preguntas en la lista de correo LL1. Se ha incorporado en La Venganza de los Nerds.)

Cuando McCarthy [a] diseñó Lisp a finales de 1950, fue un cambio radical respecto a los lenguajes existentes, el más importante de los cuales era Fortran.

Lisp incorporaba nueve ideas nuevas:



1. Condicionales. Una condicional es una construcción if-then-else. Ahora las damos por hecho. Fueron inventadas por McCarthy mientras desarrollaba Lisp. (Fortran en ese momento sólo tenía una condicional goto, basada estrechamente en la instrucción de transferencia en el hardware subyacente.) McCarthy, quien estaba en el comité de Algol, introdujo condicionales en Algol, de donde se extendieron a la mayoría de los otros lenguajes.

2. Un tipo de función. En Lisp, las funciones son objetos de primera clase―son un tipo de datos como enteros, cadenas, etc., y tienen una representación literal, se pueden almacenar en las variables, se pueden pasar como argumentos, y así sucesivamente.

3. Recursividad. La recursividad ha existido como un concepto matemático desde antes de Lisp, por supuesto; pero Lisp fue el primer lenguaje de programación en soportarlo. (Podría decirse que esta implícito en hacer las funciones objetos de primera clase.)

4. Un nuevo concepto de variables. En Lisp, todas las variables son, en efecto, apuntadores. Los valores tienen tipos, no variables, y asignar o enlazar variables significa copiar apuntadores, no a lo que apuntan.

5. Recolección de basura.

6. Programas compuestos por expresiones. Los programas de Lisp son árboles de expresiones, cada una de las cuales devuelve un valor. (En algunos Lisps las expresiones pueden devolver varios valores.) Esto contrasta con Fortran y la mayoría de los lenguajes sucesivos, que distinguen entre expresiones y declaraciones.

Era natural tener esta distinción en Fortran, porque (como era de esperar en un lenguaje en el que el formato de entrada eran tarjetas perforadas), el lenguaje fue orientado a líneas. No se podían anidar las declaraciones. Así, mientras que necesitabas expresiones para que las matemáticas funcionaran, no tenía sentido hacer que cualquier otra cosa devolviera un valor, porque no podía haber nada esperándolo.

Esta limitación desaparecio con la llegada de los lenguajes estructurados en bloques, pero para entonces ya era demasiado tarde. La distinción entre expresiones y declaraciones se afianzó. Se transmitió de Fortran a Algol y de allí a sus descendientes.

Cuando un lenguaje está hecho enteramente de expresiones, puedes hacerlas como quieras. Puedes decir ya sea (utilizando la sintaxis de Arc):

(if foo (= x 1) (= x 2))

o

(= x (if foo 1 2))

7. Un tipo de símbolo. Los símbolos difieren de las cadenas en que se puede probar la igualdad comparando un apuntador.

8. Una notación para el código utilizando árboles de símbolos.

9. Todo el lenguaje siempre está disponible. No hay distinción real entre tiempo de lectura, tiempo de compilación y tiempo de ejecución. Puedes compilar o ejecutar código durante la lectura, leer o ejecutar código durante la compilación, y leer o compilar código en tiempo de ejecución.

Ejecutar código en tiempo de lectura le permite a los usuarios reprogramar la sintaxis de Lisp; ejecutar código en tiempo de compilación es la base de las macros; compilar en tiempo de ejecución es la base del uso de Lisp como lenguaje de extensión en programas como Emacs; y la lectura en tiempo de ejecución permite a los programas comunicarse utilizando expresiones-S, una idea reinventada recientemente como XML.
 



Cuando recién se inventó Lisp, todas estas ideas estaban muy alejadas de la práctica ordinaria de la programación, que estaba dictada en gran medida por el hardware disponible a finales de 1950.

Con el tiempo, el lenguaje por defecto, plasmado en una serie de lenguajes populares, ha ido evolucionando hacia Lisp. Las ideas de la 1ra. a la 5ta. se han generalizado. La 6ta. está comenzando a aparecer en las nuevas tendencias. Python se asemeja a la 7ma., si bien no parece haber ninguna sintaxis para ello. La 8va., que (con la 9na.) es lo que hace posible las macros de Lisp, sigue siendo hasta la fecha única a Lisp, tal vez porque (a) requiere esos paréntesis, o algo igual de malo, y (b) si agregas ese incremento final de poder, ya no podras pretender haber inventado un nuevo lenguaje, sino sólo haber diseñado un nuevo dialecto de Lisp ; -)

Aunque útil para los programadores de hoy en día, es extraño describir a Lisp en términos de su variación a partir de los recursos al azar que otros lenguajes han adoptado. Probablemente no fue asi como McCarthy lo penso. Lisp no fue diseñado para corregir los errores en Fortran; fue más el subproducto de un intento de axiomatizar la computación.





Traducido de What Made Lisp Different por Paul Graham. Traducción: Armando Alvarez

 
 

Notas del Traductor:


[a] John McCarthy (n. 4 de septiembre de 1927, Boston, Massachusetts), también conocido como Tío John McCarthy, es un prominente informático que recibió el Premio Turing en 1971 por sus importantes contribuciones en el campo de la Inteligencia Artificial. De hecho, fue el responsable de introducir el término “inteligencia artificial”, concepto que acuñó en la Conferencia de Dartmouth en 1956.

McCarthy inventó el lenguaje de programación Lisp y publicó su diseño en Comunicaciones del ACM en 1960.

En 1961, fue el primero en sugerir públicamente (en un discurso dado para celebrar el centenario del MIT) que la tecnología de tiempo compartido de las computadoras podría conducir a un futuro en el que el poder del cómputo e incluso aplicaciones específicas podrían ser vendidas como un servicio (como el agua o la electricidad).

La idea de una computadora o una utilidad informática era muy popular a fines de la década del 60, pero se desvaneció hacia mediados de los 70 cuando se volvió claro que el hardware, software y las tecnologías de telecomunicación simplemente no estaban preparadas. Sin embargo, desde el 2000, la idea ha reaparecido en diferentes formas. [Fuente: Wikipedia. Ver]