Si hallas algún problema con tu código o proyecto, recuerda probar siempre en un ambiente de testing antes subir el código al trabajo final.
Solución:
Probablemente lo que Paul quiere decir es que la representación de Lisp sintaxis como un ceceo valor es estandarizado y generalizado. Es decir, un programa Lisp es solo un tipo especial de expresión S, y es excepcionalmente fácil escribir código Lisp que manipula el código Lisp. Escribir un intérprete de Lisp en Lisp es un caso especial y no es tan emocionante como la capacidad general de tener una representación unificada tanto para el código como para los datos.
Acabo de eliminar una respuesta muy larga que probablemente sea inapropiada aquí.
Sin embargo considera que:
-
LISP no tiene “sintaxis”(1) si lo dices con el significado que tiene para lenguajes como C/Java/Pascal… hay una sintaxis (inicial pero personalizable) para el Lector LISP comúnpero eso es algo diferente (LISP del que habla Graham no es LISP común, y un (el) lector no es el lenguaje LISP, sino solo un procedimiento). Algo así como “(lambda (x) (* x 2))” es no código LISP, pero texto que, por ejemplo, el lector estándar CL puede convertir a código LISP.
-
LISP no solo lata estar escrito en LISP (si te refieres a la habilidad “bootstrap”) pero en realidad empezó a existir de esa manera. La primera implementación de eval a fines de la década de 1950 se escribió en LISP en papel y luego se convirtió manualmente en lenguaje de máquina.(2): LISP comenzó como una idea puramente teórica que no pretendía ser implementada. No conozco ningún otro lenguaje informático que haya seguido ese camino. Por ejemplo, C++ se concibió como un preprocesador para un compilador de C y se escribió en C, no era un programa de C++ que luego se convirtió a C para poder ejecutarlo.
Hay muchos otros aspectos en los que LISP es bastante diferentey creo que la mejor manera de comprenderlo es implementar un intérprete LISP de juguete (es un trabajo más pequeño de lo que uno pensaría, especialmente si su “lenguaje de máquina” es un lenguaje de escritura dinámica de alto nivel como Python).
(1) en realidad hay dos niveles de sintaxis predefinidos en LISP; el primero es la sintaxis del lector, es decir, define las reglas sobre cómo los caracteres fuente se traducen en expresiones s, el segundo define las reglas sobre cómo el compilador entiende las expresiones s al generar código de máquina real. pero si hay dos niveles de sintaxis en LISP, entonces ¿por qué es correcto decir que LISP no tiene sintaxis? la razón es que ninguno de los dos es fijo. El primer nivel, por ejemplo, es manejado por el lector de lisp común estándar que usa “tablas de lectura” que se pueden personalizar para ejecutar su código cuando se encuentra un carácter determinado en el código fuente. El segundo nivel se puede personalizar usando macros, macros de símbolos y macros de compilador y esto permite la definición de nuevas construcciones de sintaxis. En otras palabras, LISP no tiene reparado sintaxis y es posible escribir un programa LISP que comienza como LISP estándar y después de un tiempo se vuelve idéntico a Python (no estoy inventando esto, hay (había) una implementación de cl-python que admitía exactamente esto como mixed modo de fuente: cualquier cosa que comience con un paréntesis abierto se consideró usando la sintaxis LISP, otros caracteres como la sintaxis de Python).
(2) en http://www-formal.stanford.edu/jmc/history/lisp/node3.html puede encontrar cómo McCarthy describe eso eval[e, a]
se encontró en papel primero como un resultado teórico interesante (una implementación de “función universal” más ordenada que una máquina de Turing universal) cuando solo se habían establecido las estructuras de datos y las funciones nativas elementales para el lenguaje Lisp que el grupo estaba construyendo. Esta función escrita a mano fue implementada a mano por SR Russell en código de máquina y comenzó a servirles como el primer intérprete de Lisp.
Bueno, el enlace que proporcionó continúa diciendo que, si continúa leyendo, responderá su pregunta en detalle.
Lo inusual de Lisp, de hecho, la cualidad definitoria de Lisp, es que se puede escribir en sí mismo. Para entender lo que McCarthy quiso decir con esto, vamos a volver sobre sus pasos, con su notación matemática traducida al código Common Lisp.