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