Является ли ECMAScript действительно диалектом Lisp? - PullRequest
43 голосов
/ 17 февраля 2011

Мой друг обратил мое внимание на приветственное сообщение 4-го Европейского Лиспского Симпозиума :

... реализации и применения любого из диалектов Лисп, включая Common Lisp, Схема, Emacs Lisp, AutoLisp, ISLISP, Dylan, Clojure, ACL2, ECMAScript , ...

и затем спросили, действительно ли ECMAScript является диалектом Lisp.Можно ли это так считать?Почему?

Существует ли четко определенный и четкий набор критериев, помогающих нам определить, является ли язык диалектом Лисп?Или диалект воспринимается в очень свободном смысле (и в этом случае мы можем добавить Python, Perl, Haskell и т. Д. В список диалектов Lisp?)

Ответы [ 9 ]

42 голосов
/ 17 февраля 2011

Брендан Айх хотел создать похожий на Scheme язык для Netscape, но реальность вмешалась, и в итоге ему пришлось обойтись тем, что выглядело неопределенно как C и Java для "нормальных" людей, но которые работал как функциональный язык.

Лично я думаю, что называть ECMAScript "Lisp" не нужно, но каждому свое. Ключевая вещь в реальном Лиспе выглядит как характеристика того, что нотация структуры данных и нотация кода одинаковы, и это не верно в отношении ECMAScript (или Ruby, или Python, или любого другого динамического функционального языка, который не Лисп).

Предостережение: У меня нет учетных данных Lisp: -)

22 голосов
/ 17 февраля 2011

Это не так.У него много функциональных корней, но, как вы уже указали, у многих других неиспользуемых языков есть и другие.

У Лиспов есть одна оставшаяся характеристика, которая делает их лиспами, а именно то, что код лиспа написан в терминах структур данных лиспов (гомоиконичность).Это то, что делает возможной мощную макро-систему lisps, и почему она выглядит так странно, чтобы не шутить.Вызов функции - это просто список, где первый элемент в списке - это имя функции.

Поскольку код lisp - это просто данные lisp, с помощью метапрограммирования можно сделать очень мощные вещи, которые просто могутне будет сделано на других языках.Многие шрифты, даже современные, такие как clojure, в основном реализованы как набор макросов.

18 голосов
/ 17 февраля 2011

Несмотря на то, что я бы не назвал JavaScript Лиспом, по моему скромному мнению, он больше похож на способ работы с Лиспом, чем большинство основных языков (даже функциональных).

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

Во-вторых, буквальные данные (включая код в форме лямбда-выражений) легко встроить в JavaScript, поскольку их подмножество эквивалентно JSON. Это обычный шаблон Лиспа.

В-третьих, его модель значений и типов очень lispy. Он является объектно-ориентированным в широком смысле этого слова в том смысле, что все ценности имеют концепцию идентичности, но он не является особенно объектно-ориентированным в самых узких смыслах этого слова. Как и в Лиспе, объекты типизированы и очень динамичны. Код обычно разбивается на блоки функций, а не классов.

На самом деле, в мире JavaScript есть несколько (более или менее) недавних разработок, которые порой заставляют язык чувствовать себя довольно странно. Взять, к примеру, jQuery. Встраивание CSS-селекторов в качестве подъязыка, на мой взгляд, довольно похоже на Lisp. Или рассмотрим протокол метаобъектов ECMAScript Harmony: он действительно выглядит как прямой порт Common Lisp (гораздо больше, чем системы метаобъектов Python или Ruby!). Список можно продолжить.

В JavaScript нет макросов и разумной реализации REPL с интеграцией редактора, что вызывает сожаление. Конечно, влияние других языков также очень заметно (и не обязательно плохим образом). Тем не менее, между лагерями Лиспа и JavaScript существует значительная культурная совместимость. Некоторые из них могут быть случайными (например, недавний рост JIT-компиляции JavaScript), некоторые систематическими, но это определенно есть.

5 голосов
/ 15 октября 2016

Если вы вызываете 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.

5 голосов
/ 17 февраля 2011

Нет, это не так.

Чтобы считаться Лиспом, нужно быть гомойкономичным, а ECMAscript - нет.

4 голосов
/ 15 ноября 2015

Не «диалект».Я выучил LISP в 70-х годах и с тех пор не использовал его, но когда я недавно выучил JavaScript, я понял, что он похож на LISP.Я думаю, что это связано с двумя факторами: (1) JSON - это спискообразные ассоциативные структуры и (2) кажется, что «объекты» JS по сути являются JSON.Таким образом, даже если вы не пишете JS-программы на JSON, как вы пишете LISP в списках, вы почти делаете это.

Так что мой ответ заключается в том, что существует достаточно сходств, о которых напомнят программисты, знакомые с LISP.это когда они используют JavaScript.Такие выражения, как JS = LISP в костюме Java , только выражают это чувство.Я верю, что это все, что нужно.

4 голосов
/ 17 февраля 2011

Я думаю, что ECMAScript - это диалект LISP в том же смысле, что английский - это диалект французского. Есть общие черты, но у вас будут проблемы с заданиями в одном, вооруженном только знанием другого:)

Мне интересно, что только одна из трех основных презентаций, выделенных для 4-го Европейского симпозиума по Лиспу, напрямую касается Лисп (две другие - о x86 / JVM / Python и Scala).

3 голосов
/ 18 января 2013

«диалект» определенно растягивает его. Тем не менее, как человек, который выучил и использовал Python, Javascript и Scheme, Javascript явно обладает гораздо большим чувством Lisp-а (и Coffeescript, вероятно, даже в большей степени), чем Python.

Что касается того, почему Европейский симпозиум на Лиспе хотел бы изобразить Javascript как Лисп, очевидно, они хотят связать популярность Javascript, для которого популяция программистов во много, много раз больше, чем все остальные диалекты Лисп в их список объединен.

2 голосов
/ 25 апреля 2017

Да, это так.Цитируя Крокфорда:

"JavaScript имеет много общего со Scheme. Это динамический язык. Он имеет гибкий тип данных (массивы), который может легко имитировать s-выражения. И, самое главное, функции - это лямбды.

Из-за этого глубокого сходства все функции в [учебнике по рекурсивному программированию] 'Маленький интриган' могут быть написаны на JavaScript. "
http://www.crockford.com/javascript/little.html

По вопросу гомоиконичности,Я бы порекомендовал поиск этого слова вместе с JavaScript.Сказать, что это «не гомоиконично», правда, но это не конец истории.

...