Насколько практично переносить приложение Common Lisp на Clojure? Чтобы быть более конкретным, какие функции существуют в Common Lisp, которых нет в Clojure, и которые должны быть переписаны?
Перенос кода Common Lisp на Clojure
Ответы (4)
На clojure.org есть список различий между Clojure и другими Lisps. Еще кое-что, что я заметил с помощью Clojure:
Идиоматический Clojure в значительной степени опирается на неизменяемые структуры данных. Везде, где вы видите
SETFв CL, возможно, придется изменить в Clojure, чтобы воспользоваться всеми преимуществами. (У вас всегда есть возможность использовать изменяемые структуры данных Java в Clojure, но большинство людей этого не делают.)Мультиметоды Clojure похожи на CL (возможно, более мощные, потому что вы можете отправлять сообщения не только о типе), но полноценный CLOS недоступен в Clojure. Clojure вместо этого использует
struct, который представляет собой просто причудливую хэш-карту. Конечно, также доступна система Java ООП. Некоторые люди работают над переносом CLOS на Clojure, но я не уверен, насколько далеко продвинулись эти усилия на данный момент.Макросы Clojure работают немного иначе, чем макросы CL, когда дело касается разрешения символов / пространств имен. Я не уверен, что понимаю достаточно хорошо, чтобы прояснить различия. Тем не менее, в Clojure вам не нужно так много возиться с генсимами, что приятно.
Clojure не имеет такой системы условий, как CL. У вас есть только Java _3 _ / _ 4 _ / _ 5_ для обработки исключений.
Clojure не поддерживает макросы для чтения, определяемые пользователем.
Clojure не имеет нескольких возвращаемых значений. Деструктуризация в Clojure очень удобна (поддерживает списки, векторы, хэш-карты, наборы и т. Д.) И по умолчанию встроена в большее количество мест, чем CL, так что это меньшая проблема, чем могла бы быть.
В зависимости от приложения и того, как оно написано, портирование с CL на Clojure может быть практичным и простым, или может оказаться более практичным переписать его с нуля более функциональным, поточно-ориентированным способом, чтобы лучше соответствовать стилю Clojure. .
У меня нет конкретного ответа, но я бы порекомендовал эти ресурсы:
- два part talk Clojure для программистов на Лиспе
- работа Стюарта Хэллоуэя по переводу примеров из Практический Common Lisp на Clojure.
Существует несколько способов перехода с CL на Clojure (блог, другой блог, Обсуждение на HN).
Самая большая проблема, с которой многие Common Lispers сталкиваются с Clojure, когда они впервые его проверяют, - это отсутствие оптимизации хвостового вызова, что невозможно на JVM.
Для идиоматического кода CL это переписывание.
- CL является обязательным, Clojure более чисто «функциональным».
- CL является объектно-ориентированным (CLOS), Clojure - нет (использует объекты Java и имеет некоторые OO-механизмы)
- Идентификаторы и синтаксис в основном разные.
- Структуры данных разные.
- CL в основном строгий (не ленивый), Clojure использует ленивые вычисления.
Даже перенос необходимой инфраструктуры (CLOS, обработка ошибок, потоки) на Clojure имеет мало смысла, поскольку Clojure - это действительно другой язык с другим стилем программирования.
Если кто-то не хочет переписывать код, существует, например, ABCL, который является общим Лисп для JVM.