Qué hizo a Lisp especial

«El mayor de los lenguajes de programación jamás creados«
— Alan Kay, «on Lisp»

Qué hizo a Lisp 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 incorporó nueve ideas nuevas:

1. Sentencias condicionales (Conditionals). Las sentencias condicionales son construcciones if-then-else. Ahora las consideramos como algo normal. Fueron inventadas por McCarthy durante el desarrollo de Lisp. (Fortran en ese momento solo tenía sentencias goto, estrechamente vinculadas a la instrucción de bifurcación en el hardware subyacente). McCarthy, al formar parte del comité de Algol, introdujo sentencias condicionales en Algol, desde donde se expandieron a otros lenguajes.

2. Tipos funcionales (A function type). En Lisp, las funciones son objetos de primer nivel: son un tipo de dato, al igual que los números, las cadenas, etc., y tienen representación literal, pueden ser almacenadas en variables, pueden ser pasadas como argumentos, etc.

3. Recursión (Recursion). La recursión, por supuesto, existía como una concepción matemática antes de Lisp, pero Lisp fue el primer lenguaje de programación en soportarla. (Esto se puede inferir gracias a la creación de funciones como objetos de primer nivel).

4. Un nuevo concepto de variables (A new concept of variables). En Lisp, todas las variables son apuntadores efectivos. Los valores son lo que poseen los tipos, no las variables, y la asignación o vinculación de variables implica la copia de apuntadores, no de lo que apuntan.

5. Recolección de basura (Garbage-collection).

6. Programas compuestos de expresiones (Programs composed of expressions). Los programas en Lisp son árboles de expresiones, cada uno de los cuales devuelve un valor. (Algunas expresiones de Lisp pueden devolver múltiples valores). Esto contrasta con Fortran y muchos otros lenguajes exitosos, que distinguen entre 'expresiones' y 'sentencias'.

Era natural tener tal distinción en Fortran, porque el lenguaje estaba orientado de manera lineal (no es sorprendente para un lenguaje cuyo formato de entrada era una tarjeta perforada). No podías tener sentencias anidadas. Y aunque necesitabas expresiones matemáticas para trabajar, no tenía sentido hacer que algo más devolviera un valor, porque podría no haber nada que esperara un retorno.

Las restricciones se eliminaron con la aparición de lenguajes estructurados por bloques, pero para entonces ya era demasiado tarde. La diferencia entre expresiones y declaraciones ya se había establecido. Pasó de Fortran a Algol y luego a sus descendientes.

Cuando un lenguaje está completamente compuesto de expresiones, puede formar expresiones como desee. Puede escribir ya sea (utilizando la sintaxis Arc)

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

o

(= x (if foo 1 2))

7. Tipo símbolo (A symbol type). Los símbolos son diferentes de las cadenas, en este caso puede verificar la igualdad comparando punteros.

8. Notación para código (A notation for code) utilizando árboles de símbolos.

9. Todo el lenguaje siempre disponible (The whole language always available). No hay distinción explícita entre el tiempo de lectura, el tiempo de compilación y el tiempo de ejecución. Puede compilar o ejecutar código mientras lo lee, o leer o ejecutar código mientras lo compila, o leer o compilar código mientras se ejecuta.

Ejecutar código durante la lectura permite a los usuarios reprogramar la sintaxis de Lisp; ejecutar código durante la compilación es la base para macros; compilar durante la ejecución es la base para usar Lisp como un lenguaje de extensión en programas como Emacs; y finalmente, leer durante la ejecución permite a los programas interactuar usando s-expresiones, una idea que ha sido reinventada recientemente en XML.

Conclusión

Cuando Lisp fue inventado, todas estas ideas estaban muy lejos de las prácticas de programación habituales dictadas por el hardware disponible a finales de los años 50.

Con el tiempo, el lenguaje predeterminado, manifestado en el éxito de lenguajes populares, ha evolucionado gradualmente hacia Lisp. Los puntos 1-5 ahora están ampliamente difundidos. El punto 6 comienza a aparecer en la corriente principal. Hay una versión del punto 7 en Python, aunque no hay una sintaxis adecuada. El punto 8, que (junto con el punto 9) hace posibles las macros en Lisp, todavía se encuentra solo en Lisp, quizás porque (a) requiere estos paréntesis o algo igual de complicado, y (b) si se agrega este último aumento de poder, ya no se puede afirmar que se ha creado un nuevo lenguaje, sino que solo se ha desarrollado un nuevo dialecto de Lisp; -)

Aunque es útil para los programadores modernos, resulta extraño describir Lisp en términos de sus diferencias con los métodos aleatorios adoptados en otros lenguajes. Quizás no sea eso lo que tenía en mente McCarthy. Lisp no fue diseñado para corregir errores de Fortran; más bien surgió como un subproducto de un intento de axiomatizar los cálculos.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster