Подтвердить что ты не робот

Портирование общего кода Lisp на Clojure

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

4b9b3361

Ответ 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

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

Ответ 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.