Scheme is homo-iconic because its programs have an interpretation as data structures.
'(define (foo x) (* x x))
is a list, the first element of which is define
, the second (foo x)
(a list), and so on. The quote mark '
means: don't interpret this, leave it as a list. If we remove the '
we get
(define (foo x) (* x x))
which is a Scheme function definition. Because Scheme program definitions are nested list expressions (and thereby a sort of "syntax tree literals"), and Scheme is a dynamic language, you can play tricks with this to build very powerful macro/code generating systems.
Now Java isn't homo-iconic simply because it doesn't provide these kind of "program literals" that evaluate to parse tree fragments. Of course, you can define a string
String helloWorld =
"class Hello { public static void main(System.out.println(\"Hello, world!\"); }";
which you could parse and feed to a compiler, but that's awkward, because it's a string rather than a structured term.