Ответ 1
Это означает "код как данные", который является общей характеристикой семейства Lisp.
(add 2 3)
Как и выше, строка, которая представляет собой список, а также вызов функции. Префикс "Homo" означает эту характеристику.
Я пытался понять статью Wikipedia о homoiconity, но она слишком многословна и не объясняет основную теорию слова. Я должен добавить, что я не являюсь носителем английского языка, поэтому предпочитаю простой английский язык над академическими цитатами из белой бумаги.
Итак, что именно означает, что язык гомоиконический? Что делает С#, Java или JavaScript не homoiconic?
Это означает "код как данные", который является общей характеристикой семейства Lisp.
(add 2 3)
Как и выше, строка, которая представляет собой список, а также вызов функции. Префикс "Homo" означает эту характеристику.
Схема является гомо-знаковой, поскольку ее программы интерпретируются как структуры данных.
'(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!\"); }";
который вы могли бы разобрать и передать компилятору, но это неудобно, потому что это строка, а не структурированный термин.