27 de junio de 2008

La venganza de los nerds (5 de 11)


  1. Condicionales. Una condicional es una concepción del tipo if-then-else. Que damos por segura ahora, pero que Fortran I no tenía. Tenía tan sólo una condicional goto (ir a) basada estrechamente con las instrucciones de máquina subyacentes.

  2. Un tipo de dato función. En Lisp, las funciones son tipos de dato igual que los enteros y las cadenas. Tienen una representación literal, pueden ser almacenadas en variables, pueden pasarse como argumentos, y más.

  3. Recursividad. Lips fue el primer lenguaje de programación con soporte para la misma.

  4. Tipificación dinámica. En lisp las variables son apuntadores. Los valores tienen un tipo, no las variables, y asignar o ligar variables quiere decir copiar apuntadores, no aquello a lo que apuntan.

  5. Recolección de basura.

  6. Programas compuestos por expresiones. Los programas de Lisp son árboles de expresiones, cada uno de los cuales arroja un valor. Esto en contraste con Fortran y la mayoría de sus lenguajes sucesores, los cuales distinguen entre expresiones y declaraciones.

    Era natural tener esta distinción en Fortran I porque no podías anidar declaraciones. Y entonces, mientras necesitabas expresiones para que funcionaran las matemáticas, no tenía sentido hacer que ninguna otra cosa arrojara un valor, porque no podía haber nada esperándolo.

    Esta limitación se fue con la llegada de los lenguajes estructurados en bloque, pero para entonces ya era demasiado tarde. La distinción entre expresiones y declaraciones ya se había arraigado. Se difundió de Fortran a Algol y luego a ambos de sus descedientes.

  7. Un tipo de dato símbolo. Los símbolos son efectivamete apuntadores a cadenas almacenadas en un mapa hash. Así pues, puedes probar la igualdad comparando un apuntador, en lugar de comparar cada carácter.

  8. Una notación para el código que usa árboles de símbolos y constantes.

  9. Todo el lenguaje ahí todo el tiempo. No hay una distinción real entre tiempo de lectura, tiempo de compilación, y tiempo de ejecución. Puedes compilar o ejecutar el código mientras lo lees, leerlo o ejecutarlo mientras se compila, y leerlo o compilarlo mientras se ejecuta.

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


No hay comentarios.: