Schemat jest homo-ikoniczny, ponieważ jego programy interpretowane są jako struktury danych.
'(define (foo x) (* x x))
jest lista, przy czym pierwszy element jest define
, drugie (foo x)
(liście) i tak dalej. Znak zapytania '
oznacza: nie interpretuj tego, zostaw jako listę. Jeśli usuniemy '
, otrzymamyktóra jest definicją funkcji schematu. Ponieważ definicje programów Scheme są zagnieżdżonymi wyrażeniami listy (i tym samym rodzajem "literałów z drzewa składniowego"), a Scheme jest językiem dynamicznym, można w tym celu wykorzystać sztuczki do zbudowania bardzo wydajnych systemów generujących makra/kody.
Teraz Java nie jest homo-ikoną tylko dlatego, że nie dostarcza tego rodzaju "literałów programowych", które oceniają parsowanie fragmentów drzewa. Oczywiście, można zdefiniować ciąg
String helloWorld =
"class Hello { public static void main(System.out.println(\"Hello, world!\"); }";
które można analizować i karmić do kompilatora, ale to niewygodne, ponieważ jest to ciąg zamiast zorganizowany termin.
Nie sądzę, że oznacza to wiele z niczego, jak wyjaśniono tutaj: http://www.expressionsofchange.org/dont-say-homoiconic/ –