Пришлось мне столкнуться по-службе с Clojure. Мои впечатления от знакомства:
- Первое, что бросается в глаза — это дурацкие [] и {} вместо расово верных (). Не скажу, что они упрощают чтение кода, ИМХО разница невелика. А вот написание усложняют (по крайней мере мне). Набирать закрывающие сущее мучение; вылазит вот такое ))}))]) безобразие и сиди считай скобки. Так недалеко и до JavaScript с его вечными });});});
- Зато, эти же самые [] и {} позволяют сделать конфиг с симпатичным синтаксисом почти-JSON.
{
:listen {
:host "localhost"
:port 8080
}
:db {
:host "localhost"
:port 5432
:database "database"
:user "root"
:password "secret"
}
} - Жутко неудобно писать императивный код. Мутабельность здесь не любят. Код, конечно, от этого становится чище, но времени на написание уходит чуть больше.
- Нет многострочных комментариев. Пришлось написать reader macro, добавляющий комментарии в стиле Common Lisp.
(defn dispatch-reader-macro [ch fun]
(let [dm (.get (doto
(.getDeclaredField clojure.lang.LispReader
"dispatchMacros")
(.setAccessible true))
nil)]
(aset dm (int ch) fun)))
(defn read-comment [rdr pipe]
(loop [s nil]
(let [c (.read rdr)]
(if-not (and s (= c (int \#)))
(recur (= c pipe))))))
(dispatch-reader-macro \| read-comment)Единственное неудобство: нужно делатьrequire
во всех файлах, где эти комментарии используются. - Очень понравился Leiningen. Собрать с его помощью jar-файл и запустить его на сервере оказалось очень просто. Сделано "для людей".