Соответствует ли Clojure стандарту Common Lisp?

Недавно я узнал, что могу использовать любой диалект Лиспа для курса функционального программирования в школе, если он соответствует стандарту Common Lisp. Соответствует ли Clojure этому стандарту? Это слишком отличается?


person Ilea Cristian    schedule 18.11.2012    source источник
comment
Разве любой язык, следующий стандарту Common Lisp, не будет быть Common Lisp по определению? Или, другими словами: не является ли Common Lisp единственным языком, который следует стандарту Common Lisp?   -  person sepp2k    schedule 18.11.2012
comment
Так мне сказал мой профессор. Он должен соответствовать этому стандарту - я не проводил никаких исследований о том, что такое стандарт или существуют ли другие диалекты, соответствующие стандарту.   -  person Ilea Cristian    schedule 18.11.2012
comment
@sepp2k sepp2k Я почти уверен, что он имел в виду разные реализации Common Lisp, которые, как правило, сами по себе имеют достаточно багажа, чтобы их можно было назвать диалектами.   -  person Cubic    schedule 18.11.2012
comment
@Cubic: поскольку различные реализации Common Lisp реализуют стандарт ANSI, на самом деле они не являются диалектами. Это расширенные версии Common Lisp из-за большого количества расширений. Но есть несколько реализованных диалектов Common Lisp, которые часто предоставляют подмножество Common Lisp или основаны на Common Lisp. Часто эти диалекты реализуются для определенных приложений в качестве языка реализации или расширения. Примеры: Interleaf Lisp, L, SubL, вторая версия XLisp, ThinLisp, ...).   -  person Rainer Joswig    schedule 18.11.2012


Ответы (4)


Clojure не следует стандарту Common Lisp — это совершенно новый Lisp.

При этом он имеет много общего с Common Lisp, поэтому знания, полученные в одном, будут в целом применимы к другому.

Многие ключевые вещи одинаковы:

  • Применение функции, помещая функцию в начало списка, за которой следуют ее аргументы: (my-function arg1 arg2)
  • «Код — это данные» — код выражается в гомоиконичных формах, которые также являются структурами данных Лиспа.
  • Оба имеют мощную систему макросов — вы можете писать функции для генерации произвольного кода.
  • Это динамические языки,
  • Оба делают упор на интерактивную разработку с использованием REPL.
  • Они оба обычно компилируются

Некоторые вещи, которые отличаются:

  • Clojure уделяет больше внимания функциональному программированию — все структуры данных неизменяемы, а основная библиотека состоит в основном из «чистых» функций. Примечание: вы все еще можете использовать функциональный стиль в Common Lisp, Clojure просто ставит его на первый план.
  • Clojure — это Lisp-1 (например, функции и данные Scheme используют одно и то же пространство имен), тогда как Common Lisp — это Lisp-2 (функции и данные имеют другое пространство имен).
  • Clojure имеет новые литералы для карт {}, векторов [] и наборов #{} в дополнение к традиционным спискам Lisp ()
  • Common Lisp поддерживает макросы чтения, что дает вам больше возможностей для настройки синтаксиса языка.
  • Clojure использует новый подход к управлению параллелизмом, идентификацией и состоянием с помощью STM — см. http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey
  • Clojure спроектирован так, чтобы «охватить хост-платформу» (обычно JVM, но также и CLR, и в последнее время наблюдается большой интерес к использованию JavaScript с помощью ClojureScript) — это важно с практической точки зрения, поскольку это дает вам доступ к огромному количеству библиотек/инструментов.
  • Не существует стандарта Clojure — это управляемый BDFL язык с одним основным реализация с открытым исходным кодом. Очень помогает то, что Рич Хики - BDFL - он гений.

Субъективное мнение: я предвзят, но я думаю, что для большинства современных применений Clojure определенно является подходящим вариантом, если вы выбираете Лисп в настоящее время - это современный редизайн Лиспа, имеет очень яркий и инновационный сообщество, является прагматичным выбором для «достижения цели».

person mikera    schedule 18.11.2012
comment
clojure-clr все еще жив? Я думал, что Рич отказался от этого, потому что он устал делать одно и то же дважды за все время. Он передумал? - person Cubic; 18.11.2012
comment
Насколько я понимаю, некоторые люди все еще работают над этим, однако над версией Clojure и ClojureScript для JVM определенно выполняется большая часть работы. - person mikera; 18.11.2012

Вам не нужно использовать диалект Common Lisp. Существует множество отличных реализаций Common Lisp — реализаций, которые предоставляют полный Common Lisp с множеством расширений.

Для обучения программированию на Лиспе я бы рекомендовал SBCL, который предоставляет отличный компилятор. CCL (Clozure Common Lisp) — еще один хороший выбор. Оба особенно хорошо работают в Linux и Mac OS X.

Существуют диалекты Common Lisp (например, SubL, который используется для разработки Cyc, большой системы, основанной на знаниях) и языки, связанные с Common Lisp (например, Visual Lisp в AutoCAD, Emacs Lisp в GNU Emacs или ISLisp), но он не имеет смысла использовать их в обучении. Стандартных реализаций Common Lisp существует множество, и они превосходны.

Clojure — это даже не диалект Common Lisp, это другой язык.

person Rainer Joswig    schedule 18.11.2012

Clojure — это собственный язык, а не реализация языка Common Lisp. Таким образом, он не соответствует стандарту Common Lisp.

person sepp2k    schedule 18.11.2012
comment
Существуют ли какие-либо другие lisp, соответствующие стандарту Common Lisp? Этот вопрос вообще правильный? - person Ilea Cristian; 18.11.2012
comment
Существуют различные реализации стандарта Common Lisp. Однако я бы не называл их другими языками, а скорее реализациями одного и того же языка. Как я указал в своем предыдущем комментарии, я бы сказал, что любой язык, реализующий стандарт Common Lisp, является Common Lisp по определению. - person sepp2k; 18.11.2012

Я думаю, что ваш профессор имел в виду, что некоторые реализации Common Lisp добавляют много дополнительных функций, которые не являются частью стандарта, и ваш профессор не хочет, чтобы вы использовали эти функции. Так что выбирайте любую реализацию Common Lisp, которая вам нравится, например SBCL или Clozure и т. д., и используйте только настоящие функции, методы и т. д. Common Lisp, которые не уникальны для этой конкретной реализации. Другими словами, код, который вы пишете, теоретически должен работать в любой реализации Common Lisp.

Clojure, Scheme и т. д. — это другие диалекты Лиспа, которые имеют свои собственные стандарты (когда это применимо, слово «стандарты» имеет различные уровни строгости в зависимости от вашего значения) и не совпадают с Common Lisp. Другими словами, они определенно не придерживаются стандарта Common Lisp.

Откровенно говоря, когда речь идет о языках Лиспа, «диалект» обычно относится к совершенно другому языку Лиспа, который не будет иметь такого же стандарта, как другой диалект. Поэтому говорить «разные диалекты Common Lisp» не имеет смысла. Впрочем, можно сказать, «разные диалекты Лиспа».

person johnbakers    schedule 30.12.2013