Comments 11
А теперь еще http://clojurecourse.by/
Начал было неспешно писать про то, как готовить изоморфные «фуллстек» приложения на Clojure + ClojureScript + Datomic (Component, Immutant, Om, Weasel, tao, Nashorn, etc...).
Пока руки не доходят дописать. Плюс само приложение есть желание перепилить на om-next. Надеюсь, что осилю до конца лета.
Что касается ClojureScript'а и его сравнения с JavaScript, дабы не плодить здесь ссылок отправил вам сообщением. Для интересующихся — очень содержательно и с юмором о ClojureScript рассказывает Александр Соловьев в своей презентации по ClojureScript.
vk.com/myclojure.
Я только-только начал использовать clojure для переписывания части своих python модулей в одном проекте. Разбираюсь с языком по ходу дела, так что даже не все еще конструкции знаю.
Но, глядя на код в примере, не могу не отметить, что этот код пугающий. :) Как можно не запутаться в этой сложности? Я вот тут "на глаз" подправил структуру ветвлений (и заодно убрал комментарии, которые тут были только для статьи). В строке c db/get-user hash-map тоже свернул в строку -- в угоду читабельности всего этого длинного ветвящегося кода. Для return-errors изменил на сокращенный вариант объявления анонимной функции. Для такого вида и параметры можно в строку тогда размещать, но тут уже кому-как нравится.
В таком вот виде лично я могу код читать и понимать. Такое умещается в часть экрана. И четко видно все вложенности по уровням отступов, когда они идут рядом.
Может за счет какого-то редактора можно нормально работать с кодом из примера, я не знаю. :) Но у меня его читать не получается, пока не переформатируешь. Мозг ломается от перескакиваний туда-сюда.
P.S. Жаль, что тут нет подсветки синтаксиса Clojure. Без этого не очень корректно/наглядно показывает.
(defn login-controller
"Авторизация пользователя"
[request]
(let [form {:login (get-in request [:form-params "login"])
:password (get-in request [:form-params "password"])}
validate (bouncer/validate form valid/login-validator)
errors (first validate)
return-errors #(util/return-messages view/login-page :error-message % :data validate)]
(if errors
(return-errors "Проверьте правильность введенных данных")
(if-not (db/user-exist? {:login (:login form)})
(return-errors "Логин не найден")
(let [user (db/get-user {:login (:login form)} [:password])]
(if-not (hashers/check (:password form) (:password user))
(return-errors "Неверный пароль")
(do
(db/update-user {:login (:login form)} {:visited (util/date-time)})
(util/create-session request (:login form) "/"))))))))
Веб-приложения на Clojure