我刚开始学习Clojure,虽然我很喜欢这门语言,但是我不知道如何用惯用方式做一些事情。
在使用compojure编写Web应用程序时,下面是我的一个控制器操作:
(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
/ if
/ do
,我不禁想到我正在做一些非常错误的事情。如何使用函数式编程的方式来完成呢?
下面是我尝试做的伪代码:
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"
非常感谢!