¿Qué hizo que Lisp fuera especial?

«El mayor lenguaje de programación jamás creado«
- Alan Kay, "en Lisp"

¿Qué hizo que Lisp fuera especial?

Cuando McCarthy desarrolló Lisp a finales de la década de 1950, era radicalmente diferente de los lenguajes existentes, el más importante de los cuales era Fortran.

Lisp introdujo nueve nuevas ideas:

1. Condicionales. Las declaraciones condicionales son construcciones si-entonces-si no. Ahora los damos por sentado. Ellos eran inventado McCarthy durante el desarrollo de Lisp. (Fortran en ese momento solo tenía declaraciones goto, estrechamente acopladas a una instrucción de rama en el hardware subyacente). McCarthy, mientras estaba en el comité de Algol, contribuyó con condicionales a Algol, desde donde se extendieron a otros idiomas.

2. Un tipo de función. En Lisp, las funciones son objetos de primera clase: son un tipo de datos, como números, cadenas, etc., y tienen una representación literal, pueden almacenarse en variables, pueden pasarse como argumentos, etc.

3. recursividad. La recursividad, por supuesto, existía como concepto matemático antes de Lisp, pero Lisp fue el primer lenguaje de programación que la admitió. (Esto quizás esté implícito en la creación de funciones como objetos de primera clase).

4. Un nuevo concepto de variables.. En Lisp, todas las variables son punteros efectivos. Los valores son lo que tienen los tipos, no las variables, y asignar o vincular variables significa copiar punteros, no lo que apuntan.

5. Recolección de basura.

6. Programas compuestos por expresiones.. Los programas Lisp son árboles de expresiones, cada una de las cuales devuelve un valor. (Algunas expresiones Lisp pueden devolver múltiples valores). Esto contrasta con Fortran y muchos otros lenguajes exitosos que distinguen entre “expresiones” y “declaraciones”.

Era natural tener esta distinción en Fortran porque el lenguaje estaba orientado a líneas (lo que no es sorprendente para un lenguaje cuyo formato de entrada era una tarjeta perforada). No podrías tener declaraciones anidadas. Y mientras necesitaras expresiones matemáticas para funcionar, no tenía sentido que algo más devolviera un valor porque podría no haber nada esperando ser devuelto.

Las restricciones se eliminaron con la llegada de los lenguajes estructurados en bloques, pero para entonces ya era demasiado tarde. La distinción entre expresiones y declaraciones ya ha sido establecida. Pasó de Fortran a Algol y luego a sus descendientes.

Cuando un lenguaje está compuesto enteramente de expresiones, puedes componer expresiones como quieras. Puedes escribir cualquiera de las dos (usando la sintaxis Arco)

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

o

(= x (if foo 1 2))

7. Un tipo de símbolo. Los caracteres son diferentes de las cadenas, en cuyo caso puede verificar la igualdad comparando punteros.

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

9. Todo el idioma está siempre disponible.. No existe una diferencia obvia entre el tiempo de lectura, el tiempo de compilación y el tiempo de ejecución. Puede compilar o ejecutar código mientras lee, o leer o ejecutar código mientras compila, o leer o compilar código mientras se ejecuta.

Ejecutar código mientras se lee permite a los usuarios reprogramar la sintaxis de Lisp; ejecutar código en tiempo de compilación es la base de las macros; la compilación en tiempo de ejecución es la base para utilizar Lisp como lenguaje de extensión en programas como Emacs; y finalmente, la lectura en tiempo de ejecución permite que los programas se comuniquen utilizando expresiones-s, una idea recientemente reinventada en XML.

Conclusión

Cuando Lisp se inventó por primera vez, estas ideas estaban muy lejos de las prácticas de programación convencionales dictadas por el hardware disponible a finales de los años cincuenta.

Con el tiempo, el lenguaje predeterminado, plasmado en el éxito de los lenguajes populares, evolucionó gradualmente hacia Lisp. Los puntos 1 a 5 ahora gozan de amplia aceptación. El punto 6 está empezando a aparecer en la corriente principal. En Python, hay una cláusula 7 de alguna forma, aunque no existe una sintaxis adecuada. El elemento 8, que (junto con el elemento 9) hace posibles las macros en Lisp, todavía está solo en Lisp, probablemente porque (a) requiere esos paréntesis o algo igualmente malo, y (b) si agrega este último aumento en potencia, puede Ya no pretendo haber inventado un nuevo idioma, sino sólo haber desarrollado un nuevo dialecto de Lisp; -)

Aunque esto es útil para los programadores modernos, resulta extraño describir Lisp en términos de su diferencia con las técnicas aleatorias adoptadas en otros lenguajes. Puede que esto no sea lo que McCarthy estaba pensando. Lisp no fue diseñado para corregir los errores de Fortran; parecía más como un subproducto de intentar axiomatizar los cálculos.

Fuente: habr.com

Añadir un comentario