Lo que hizo especial a Lisp

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



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

Lisp ha implementado nueve nuevas ideas:

1. Condicionales . Las declaraciones condicionales son una construcción if-then-else. Ahora los damos por sentado. Fueron inventados por McCarthy durante el desarrollo de Lisp. (Fortran en ese momento solo tenía declaraciones Goto que estaban estrechamente relacionadas con las instrucciones de rama en el hardware subyacente). McCarthy, mientras estaba en el comité de Algol, hizo declaraciones condicionales en Algol, desde donde se extendieron a otros idiomas.

2. Tipos de funciones (un tipo de función) . En Lisp, las funciones son objetos de la primera clase: son un tipo de datos, como números, cadenas, etc., y tienen una representación literal, se pueden almacenar en variables, se pueden pasar como argumentos, etc.

3. La recursión . La recursión, por supuesto, existía como un concepto matemático antes de Lisp, pero Lisp fue el primer lenguaje de programación que lo soportó. (Esto posiblemente esté implicado en la creación de funciones como objetos de primera clase).

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

5. Recolección de basura .

6. Los programas están compuestos de expresiones (Programas compuestos de expresiones) . Los programas de Lisp son árboles de expresión, cada uno de los 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 tanta diferencia en Fortran porque el idioma estaba orientado linealmente (no es sorprendente para un idioma en el que el formato de entrada era una tarjeta perforada). No podría haber declaraciones anidadas. Y aunque necesitabas expresiones matemáticas para trabajar, no tenía sentido obligar a otra cosa a devolver un valor, porque podría no haber algo que estuviera esperando un retorno.

Las restricciones se levantaron con el advenimiento de los lenguajes estructurados en bloques, pero para entonces ya era demasiado tarde. La distinción entre expresiones y declaraciones ya se ha solucionado. Pasó de Fortran a Algol y más allá a sus descendientes.

Cuando el lenguaje está hecho completamente de expresiones, puede hacer expresiones como desee. Puede escribir cualquiera (usando la sintaxis de Arc )

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

cualquiera

 (= 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 los punteros.

8. Una notación para el código usando árboles de caracteres.

9. Todo el idioma siempre disponible . No hay una diferencia aparente 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 en tiempo de ejecución.

Ejecutar código mientras 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 usar Lisp como un lenguaje de extensión en programas como Emacs; y finalmente, la lectura en tiempo de ejecución permite que los programas interactúen usando expresiones s, una idea recientemente reinventada en XML.

Conclusión


Cuando se inventó Lisp, todas estas ideas estaban muy lejos de las prácticas de programación habituales dictadas por el hardware disponible a fines de la década de 1950.

Con el tiempo, el idioma predeterminado, incorporado al éxito de los idiomas populares, evolucionó gradualmente hacia Lisp. Los puntos 1-5 ahora están muy extendidos. El punto 6 comienza a aparecer en la corriente principal. En Python, de alguna forma, hay un elemento 7, aunque no hay una sintaxis adecuada. La cláusula 8, que (con la cláusula 9) hace posibles las macros en Lisp, todavía está solo en Lisp, tal vez porque (a) requiere estos corchetes o algo igual de malo, y (b) si si agrega este último aumento de poder, ya no puede afirmar que inventó un nuevo lenguaje, sino que solo desarrolló un nuevo dialecto de Lisp; -)

Aunque esto es útil para los programadores modernos, es extraño describir a Lisp en términos de cómo difiere de los trucos aleatorios utilizados en otros idiomas. Quizás esto no es lo que McCarthy estaba pensando. Lisp no fue diseñado para corregir errores de Fortran; Parecía más un subproducto de un intento de axiomatizar los cálculos .

Source: https://habr.com/ru/post/476994/


All Articles