Портирование Common Lisp-кода в Clojure - PullRequest
34 голосов
/ 27 февраля 2009

Насколько практично переносить приложение Common Lisp на Clojure? Чтобы быть более конкретным, какие функции существуют в Common Lisp, которых нет в Clojure, и их нужно было бы переписать?

Ответы [ 4 ]

31 голосов
/ 27 февраля 2009

На clojure.org есть список различий между Clojure и другими Лиспами. Некоторые другие вещи, которые я заметил, используя Clojure:

  • Идиоматическая Clojure сильно склоняется к неизменным структурам данных. Везде, где вы видите SETF в CL, возможно, придется изменить в Clojure, чтобы использовать все преимущества. (У вас всегда есть возможность использовать изменяемые структуры данных Java в Clojure, но большинство людей этого не делают.)

  • Мультиметоды Clojure похожи на CL (возможно, более мощный, потому что вы можете отправлять не только текст), но полноценный CLOS недоступен в Clojure. Вместо этого Clojure использует struct, что является просто фантастическим хэш-картой. Конечно, также доступна система ООП Java. Некоторые люди работают над переносом CLOS на Clojure, но я не уверен, насколько далеко продвинулись эти усилия на данный момент.

  • Макросы Clojure работают немного иначе, чем макросы CL, когда речь идет о разрешении символов / пространства имен. Я не уверен, что понимаю достаточно хорошо, чтобы объяснить различия. В Clojure вам не нужно так много возиться с генсимимами, что приятно.

  • У Clojure нет системы условий, подобной CL. У вас есть только Java try / catch / finally для обработки исключений.

  • Clojure не допускает пользовательские макросы для чтения.

  • Clojure не имеет нескольких возвращаемых значений. Деструктурирование в Clojure очень удобно (поддерживает списки, векторы, хэш-карты, наборы и т. Д.) И по умолчанию встроено в большее количество мест, чем CL, поэтому это не такая большая проблема, как могла бы.

В зависимости от приложения и того, как оно написано, перенос с CL на Clojure может быть практичным и простым, или может быть более практичным переписать его с нуля более функциональным, поточно-ориентированным способом, чтобы лучше соответствовать в стиле Clojure.

8 голосов
/ 27 февраля 2009

У меня нет конкретного ответа, но я бы порекомендовал следующие ресурсы:

5 голосов
/ 27 февраля 2009

Существует несколько аккаунтов перехода с CL на Clojure ( блог , другой блог , Тема на HN ).

Самая большая проблема, с которой Common Lispers сталкивается с Clojure, когда они впервые его проверяют, это отсутствие Tail Call Optimization , что невозможно в JVM.

3 голосов
/ 27 ноября 2010

Для идиоматического кода CL это переписать.

  • CL является обязательным, Clojure - более «функциональным».
  • CL является объектно-ориентированным (CLOS), Clojure нет (использует объекты Java и имеет несколько OO-механизмов)
  • Идентификаторы и синтаксис в основном разные.
  • Структуры данных различны.
  • CL в основном строгий (не ленивый), Clojure использует ленивые вычисления.

Даже перенос необходимой инфраструктуры (CLOS, Error Error, Streams) в Clojure не имеет особого смысла, поскольку Clojure - это действительно другой язык с другим стилем программирования.

Если кто-то не хочет переписывать код, есть, например, ABCL , который является Common Lisp для JVM.

...