Насколько практично переносить общее приложение Lisp на Clojure? Чтобы быть более конкретным, какие функции существуют в Common Lisp, которых нет в Clojure, и их нужно переписать?
Портирование общего кода Lisp на Clojure
Ответ 1
Там есть список на clojure.org различий между Clojure и другими Lisps. Некоторые другие вещи, которые я заметил с помощью Clojure:
-
Идиоматический Clojure сильно опирается на неизменные структуры данных. Везде, где вы видите
SETF
в CL, возможно, придется изменить в Clojure, чтобы воспользоваться всеми преимуществами. (У вас всегда есть возможность использовать изменяемые структуры данных Java в Clojure, но большинство людей этого не делает.) -
Clojure multimethods похожи на CL (возможно, более мощные, потому что вы можете отправлять вещи, отличные от типа), но полнофункциональный CLOS недоступен в clojure. Clojure вместо этого использует
struct
, что является просто причудливым хэшмапом. Разумеется, также доступна система Java OOP. Некоторые люди работают над переносом CLOS на Clojure, но я не уверен, насколько далеко продвинулись эти усилия на этом этапе. -
Clojure макросы работают несколько иначе, чем макросы CL, когда дело доходит до разрешения символа/пространства имен. Я не уверен, понимаю ли я достаточно хорошо, чтобы разъяснить различия. Вам не обязательно входить в gensyms столько же в Clojure, хотя это хорошо.
-
Clojure не имеет такой системы условий, как CL. У вас есть только Java
try
/catch
/finally
для обработки исключений. -
Clojure не разрешает пользовательские макросы чтения.
-
Clojure не имеет нескольких возвращаемых значений. Деструктурирование в Clojure очень хорошо (поддерживает списки, векторы, хэш-карты, наборы и т.д.), И по умолчанию он встроен в большее количество мест, чем CL, поэтому это меньше проблема, чем это могло бы быть.
/li >
В зависимости от приложения и того, как оно написано, может быть практичным и простым перенос с CL на Clojure, или может быть более практичным переписать его с нуля более функциональным, потокобезопасным способом лучше подходят для стиля Clojure.
Ответ 2
У меня нет конкретного ответа, но я бы рекомендовал эти ресурсы:
- Rich Hickey два часть talk Clojure для Lisp Программисты
- Stuart Halloway работа по переводу примеров из Питера Сейбела Практическое общее Lisp до Clojure.
Ответ 3
Существует несколько учетных записей перехода от CL к Clojure (blog, еще один блог, Thread on HN).
Самая большая проблема, с которой сталкиваются Common Lispers с Clojure, когда они сначала проверяют ее отсутствие Оптимизация Tail Call, что невозможно в JVM.
Ответ 4
Для идиоматического кода CL это переписывается.
- CL обязательно, Clojure является более чисто функциональным.
- CL объектно-ориентированный (CLOS), Clojure нет (использует объекты Java и имеет некоторые OO-механизмы)
- Идентификаторы и синтаксис в основном разные.
- Структуры данных различны.
- CL в основном строгий (не ленивый), Clojure использует ленивые вычисления.
Даже перенос необходимой инфраструктуры (CLOS, Обработка ошибок, Потоки) на Clojure имеет мало смысла, поскольку Clojure - это действительно другой язык с другим стилем программирования.
Если вы не хотите переписывать код, например, ABCL, который является общим Lisp для JVM.