Что означает гомоциконность?

Я пытался понять статью Wikipedia о homoiconity, но она слишком многословна и не объясняет основную теорию слова. Я должен добавить, что я не являюсь носителем английского языка, поэтому предпочитаю простой английский язык над академическими цитатами из белой бумаги.

Итак, что именно означает, что язык гомоиконический? Что делает С#, Java или JavaScript не homoiconic?

Ответ 1

Это означает "код как данные", который является общей характеристикой семейства Lisp.

(add 2 3)

Как и выше, строка, которая представляет собой список, а также вызов функции. Префикс "Homo" означает эту характеристику.

Ответ 2

Схема является гомо-знаковой, поскольку ее программы интерпретируются как структуры данных.

'(define (foo x) (* x x))

- это список, первым элементом которого является define, второй (foo x) (список) и т.д. Значок кавычки ' означает: не интерпретируйте это, оставьте его в виде списка. Если мы удалим ', получим

(define (foo x) (* x x))

который является определением функции схемы. Поскольку определения программ Scheme представляют собой вложенные выражения в виде списка (и, следовательно, своего рода "синтаксические древовидные литералы" ), а Scheme - динамический язык, вы можете играть с трюками, чтобы создать очень мощные системы генерации макро/кода.

Теперь Java не является гомо-знаковым просто потому, что он не предоставляет такие "программные литералы", которые оценивают для разбора фрагментов дерева. Конечно, вы можете определить строку

String helloWorld =
   "class Hello { public static void main(System.out.println(\"Hello, world!\"); }";

который вы могли бы разобрать и передать компилятору, но это неудобно, потому что это строка, а не структурированный термин.