Что именно означает гомойконичность?
Я пытался понять статью в Википедии о гомойконичности, но она слишком многословна и не объясняет основную теорию этого слова в сжатой форме. Я должен добавить, что я не являюсь носителем английского языка, поэтому я предпочитаю простой английский, а не академические цитаты.
Итак, что именно это означает, если язык гомоичен? Что делает C#, Java или JavaScript негомойичными?
2 ответа
Это означает "код как данные", что является общей характеристикой семейства Lisp.
(add 2 3)
Как и выше строка, которая является одновременно списком и вызовом функции. Префикс "Homo" обозначает эту характеристику.
Схема гомо-иконическая, потому что ее программы интерпретируются как структуры данных.
'(define (foo x) (* x x))
список, первый элемент которого define
, второй (foo x)
(список) и так далее. Кавычка '
означает: не интерпретируйте это, оставьте это как список. Если мы удалим '
мы получаем
(define (foo x) (* x x))
который является определением функции Scheme. Поскольку определения программы Scheme являются выражениями вложенного списка (и, следовательно, являются своего рода "литералами синтаксического дерева"), а Scheme является динамическим языком, с этим можно поиграть, чтобы создать очень мощные системы генерации макросов / кода.
Теперь Java не является гомо-иконическим просто потому, что не предоставляет такого рода "программные литералы", которые оценивают для анализа фрагментов дерева. Конечно, вы можете определить строку
String helloWorld =
"class Hello { public static void main(System.out.println(\"Hello, world!\"); }";
который вы можете проанализировать и передать компилятору, но это неудобно, потому что это строка, а не структурированный термин.
Гомоиконизм может означать разные вещи для разных людей. Первоначально он был определен в контексте языка TRAC как таковой:
Поскольку процедуры и текст TRAC имеют одинаковое представление внутри и вне процессора, применим термин "гомо-иконический", от "гомо" означает одно и то же, а "значок" означает представление.
Однако это определение проблематично, потому что трудно точно определить, что имеется в виду под внутренними и внешними представлениями. Это также совсем не то, что большинство людей сегодня имеет в виду.
Сегодня большинство людей, вероятно, имеют в виду что-то вроде принятого здесь ответа Майка Янга, а именно, что представление структурированных данных на языке элегантно (буквальный синтаксис), и что такие структуры данных сами по себе являются основным средством представления кода.
Чтобы еще больше запутать ситуацию, эту концепцию часто называют "код как данные" (что само по себе является очень перегруженным термином).
Больше информации здесь: