Если вы вызываете ECMAScript Lisp, вы в основном утверждаете, что любой динамический язык - это Lisp.Поскольку у нас уже есть «динамический язык», вы сокращаете «Лисп» до бесполезного синонима для него, вместо того, чтобы позволить ему иметь более конкретное значение.
Лисп должен правильно ссылаться на язык с определенными атрибутами.
Языком является Лисп, если:
Его исходный код представляет собой древовидные данные, которые имеют прямую печатную запись в виде вложенных списков.Каждая возможная древовидная структура имеет рендеринг в соответствующей нотации и может восприниматься как конструкция;сама нотация не должна расширяться для расширения языка.
Древовидные данные - это основная структура данных в самом языке, которая делает программы восприимчивыми к манипуляциям программами.
Язык имеет символьный тип данных.Символы имеют печатное представление, которое является внутренним : когда два или более экземпляров одной и той же печатной записи для символа появляются в записи, они все обозначают один и тот же объект.
- AОсновное достоинство объекта символа состоит в том, что он отличается от всех других символов.В семантике программ на Лиспе символы по-разному сочетаются с различными другими сущностями и, таким образом, служат именами для этих сущностей.
- Например, диалект Лиспа обычно имеет переменные, как и другие языки.В Лиспе переменные обозначаются символами (объектами в памяти), а не текстовыми именами.Когда часть программы на Лиспе определяет некоторую переменную
a
, синтаксис для этого a
представляет собой объект символа, а не строку символов "a"
, которая является просто именем этого символа для целей печати.Ссылка на переменную, выражение, записанное как a
в другом месте программы, также является объектом on.Из-за того, как работают символы, это один и тот же объект;эта одинаковость объекта затем связывает ссылку с определением.Однородность объекта может быть реализована как равенство указателей на уровне машины.Мы знаем, что два значения символов одинаковы, потому что они являются указателями на одну и ту же область памяти в куче (объект типа символа). - Показательный пример: диалект NewLisp, который имеет нетрадиционное управление памятью для большинства типов данных, включая вложенные списки , делает исключение для символов, заставляя их вести себя описанным выше образом.Без этого это не был бы Лисп.Цитата: "Объекты в newLISP (, исключая символы и контексты) передаются путем копирования значения в другие пользовательские функции. В результате каждый объект newLISP требует только одну ссылку." [акцент мой].Передача символов также, как при копировании значения, может уничтожить их идентичность: функция, получающая символ, не получит исходный и, следовательно, неправильно получит свою идентичность.
- Составные выраженияв языке Lisp - те, которые не являются простыми основными цветами, такими как числа или строки - состоят из простого списка, первым элементом которого является символ, обозначающий операцию.Остальные элементы, если они есть, являются выражениями аргументов.В диалекте Лиспа применяется какая-то стратегия оценки, чтобы уменьшить выражение до значения и вызвать любые побочные эффекты, которые он может иметь.
- Я бы ориентировочно утверждал, что списки, состоящие из двоичных ячеек, содержащих пары значений, оканчивающиеся специальным пустым объектом списка, вероятно, должны рассматриваться как часть определения Лисп:дело в том, чтобы создать новый список из существующего путем «вывода» нового элемента на передний план, а также простой рекурсии «первого» и «остального» списка и т. д.
И тогда я бы остановился прямо там.Некоторые люди считают, что системы Lisp должны быть интерактивными: предоставить слушателю среду, в которой все изменчиво и может быть переопределено в любое время и так далее.Некоторые считают, что в Лиспе должны быть первоклассные функции: должен быть оператор lambda
и так далее.Настойчивые традиционалисты могут даже настаивать на том, что должны быть функции car
и cdr
, нотация с парами в точках, поддерживающая неправильные списки, и что списки должны состоять из ячеек и заканчиваться определенным символом nil
, обозначающим пустоесписок, а также логическое ложное.Настаивание на car
и cdr
позволяет Scheme быть Лиспом, но nil
, являющимся ограничителем списка и ложными правилами
Чем больше мы углубляемся в определение "диалекта Лисп", тем большеэто становится политическим;люди расстраиваются из-за того, что их любимый диалект (возможно, он сам их создал) исключен из-за какой-то технической детали.Настаивание на car
и cdr
позволяет Scheme быть Лиспом, но nil
является ограничителем списка, и false исключает его.Что, Схема, а не Лисп?
Итак, исходя из вышесказанного, ECMAScript не является диалектом Лисп.Однако реализация ECMAScript содержит функциональные возможности, которые могут быть представлены как диалект Lisp, и было разработано множество таких диалектов .Кто-то, кому нужно, чтобы ECMAScript считался Лиспом по некоторым эмоциональным причинам, возможно, должен согласиться с этим: что семантика для поддержки Лисп есть, и ему просто нужен подходящий интерфейс для этой семантики, который может быть разработан в ECMAScript и который может взаимодействоватьс кодом ECMAScript.