Question: I was trying to understand the [Wikipedia article on homoiconity](http://en.wikipedia.org/wiki/Homoiconicity), but it's too verbose and does not explain the main theory behind the word concisely. I should add that I'm not a native English speaker so I prefer simple English over academic white paper quotes.

So, what exactly does it mean if a language is homoiconic? What makes C#, Java or JavaScript non-homoiconic?

Answer: 
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.
Homoiconicy can mean different things to different people. Originally, it was defined
in the context of the language *TRAC*, as such:

> 
> Because TRAC procedures and text have the same representation inside and
>  outside the processor, the term homo-iconic is applicable, from homo meaning
>  the same, and icon meaning representation.
> 
> 
> 

However, that definition is problematic, because it is hard to precisely pin down
what is meant by internal and external representations. It is also not at all what
most people mean by it today.

Today, most people probably mean something along the lines of the accepted answer
by Mike Yang here, namely that the represenation of *structured* data in the language
is elegant (literal syntax), and that such datastructures are themselves the main means
of representating code.

To confuse matters further, this concept is often called "code as data" (which
is itself a very overloaded term).

More info here:

* [Exploration of the original definition of homo-iconic](https://www.expressionsofchange.org/dont-say-homoiconic/)
* [Definition of homo-iconic as in current use](https://www.expressionsofchange.org/homoiconicity-revisited/)