Solución:
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 llamada a función. El prefijo “Homo” representa esta característica.
Scheme 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 es define
, el segundo (foo x)
(una lista) y así sucesivamente. La comilla '
significa: no interpretes esto, déjalo como una lista. Si quitamos el '
obtenemos
(define (foo x) (* x x))
que es una definición de función de Scheme. Debido a que las definiciones de programa de Scheme son expresiones de lista 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 de generación de macro / código muy poderosos.
Ahora bien, Java no es homo-icónico simplemente porque no proporciona este tipo de “literales de programa” que evalúan para 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.