Недавно я узнал, что могу использовать любой диалект Лиспа для курса функционального программирования в школе, если он соответствует стандарту Common Lisp. Соответствует ли Clojure этому стандарту? Это слишком отличается?
Соответствует ли Clojure стандарту Common Lisp?
Ответы (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 определенно является подходящим вариантом, если вы выбираете Лисп в настоящее время - это современный редизайн Лиспа, имеет очень яркий и инновационный сообщество, является прагматичным выбором для «достижения цели».
Вам не нужно использовать диалект 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, это другой язык.
Clojure — это собственный язык, а не реализация языка Common Lisp. Таким образом, он не соответствует стандарту Common Lisp.
Я думаю, что ваш профессор имел в виду, что некоторые реализации Common Lisp добавляют много дополнительных функций, которые не являются частью стандарта, и ваш профессор не хочет, чтобы вы использовали эти функции. Так что выбирайте любую реализацию Common Lisp, которая вам нравится, например SBCL или Clozure и т. д., и используйте только настоящие функции, методы и т. д. Common Lisp, которые не уникальны для этой конкретной реализации. Другими словами, код, который вы пишете, теоретически должен работать в любой реализации Common Lisp.
Clojure, Scheme и т. д. — это другие диалекты Лиспа, которые имеют свои собственные стандарты (когда это применимо, слово «стандарты» имеет различные уровни строгости в зависимости от вашего значения) и не совпадают с Common Lisp. Другими словами, они определенно не придерживаются стандарта Common Lisp.
Откровенно говоря, когда речь идет о языках Лиспа, «диалект» обычно относится к совершенно другому языку Лиспа, который не будет иметь такого же стандарта, как другой диалект. Поэтому говорить «разные диалекты Common Lisp» не имеет смысла. Впрочем, можно сказать, «разные диалекты Лиспа».