Я только начал взламываться с помощью Clojure, и хотя я обожаю язык, я не могу понять, как делать определенные вещи идиоматически.
Написание веб-приложения с использованием compojure, здесь одно из моих действий с контроллером:
(defn create [session params]
(let [user (user/find-by-email (params :email))]
(if user
(if (user/authenticate user (params :password))
(do (sign-in session user)
(resp/redirect "/home?signed-in=true"))
(resp/redirect "/?error=incorrect-password"))
(let [new-user (user/create params)]
(sign-in session new-user)
(resp/redirect "/home?new-user=true")))))
Я пишу это очень императивно. Используя так много let
s/if
s/do
s, я не могу не думать, что я делаю что-то очень не так. Как я могу написать это функционально?
Здесь psuedocode для того, что я пытаюсь сделать
look if user exists
if user exists, try to sign user in using password provided
if password is wrong, redirect to "/?error=incorrect-password"
if password is correct, sign user in and redirect to "/home?signed-in=true"
else create user, sign user in, and redirect to "/home?new-user=true"
Большое спасибо!