world quien programming learning hello desarrollo compiler programming-languages terminology theory homoiconicity

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.