programming-languages - quien - programming in lisp
¿Qué significa exactamente homoiconicidad? (2)
Estaba tratando de entender el artículo de Wikipedia sobre la homoiconía , pero es demasiado detallado y no explica de manera concisa la teoría principal detrás de la palabra. Debo agregar que no soy un hablante nativo de inglés, por lo que prefiero el inglés simple a las citas académicas.
Entonces, ¿qué significa exactamente si una lengua es homoicónica? ¿Qué hace que C #, Java o JavaScript no sean homoicónicos?
El esquema es homo-icónico porque sus programas tienen una interpretación como estructuras de datos.
''(define (foo x) (* x x))
es una lista, cuyo primer elemento se define
, el segundo (foo x)
(una lista), y así sucesivamente. La comilla significa: no interprete esto, déjelo como una lista. Si eliminamos el ''
obtenemos
(define (foo x) (* x x))
que es una definición de función de esquema. Debido a que las definiciones de programas de Scheme son expresiones de listas anidadas (y por lo tanto una especie de "literales de árbol de sintaxis"), y Scheme es un lenguaje dinámico, puede jugar trucos con esto para construir sistemas muy potentes de generación de macro / código.
Ahora Java no es homo-icónico simplemente porque no proporciona este tipo de "programas literales" que evalúan analizar fragmentos de árboles. Por supuesto, puede definir una cadena
String helloWorld =
"class Hello { public static void main(System.out.println(/"Hello, world!/"); }";
que podría analizar y alimentar a un compilador, pero eso es incómodo, porque es una cadena en lugar de un término estructurado.
Significa "código como datos", que es una característica general de la familia Lisp.
(add 2 3)
Al igual que la cadena anterior, que es tanto una lista como una función de llamada. El prefijo "Homo" representa esta característica.