如何避免在clojure中嵌套

ipa*_*ian 1 clojure

当我写一个函数检查用户可以删除clojure的帖子时,我明白了

(defn delete!
  {:arglists}
  [^String id]
  (if (valid-number? id)
   (let [result {:code 200 :status "error" :messag "delete success"}]
     (if-let [user (session/get :userid)]
       (if-let [post (pdb/id id)]
         (if (= user (post :user_id))
           (do
             (pdb/delete! (Long/valueOf id))
             (assoc result :status "ok"))
           (assoc result :message (emsg :not-own)))
         (assoc result :message (emsg :post-id-error))))
     (assoc result :message (emsg :not-login)))))
Run Code Online (Sandbox Code Playgroud)

所以我想解决它,我明白了

https://github.com/4clojure/4clojure/blob/develop/src/foreclojure/register.clj#L27

https://github.com/4clojure/4clojure/blob/develop/src/foreclojure/utils.clj#L32 但它是行,但不是巢.

delete!功能是巢丑陋,这是很难理解它,如何编写一个宏来避免嵌套一个lot.or其他的方式,以避免它.

noi*_*ith 5

这不需要宏.我猜cond是一个宏,但它是我们需要使这个代码可读的唯一一个.

(defn delete!
  ;; {:arglists} ; this line will not compile
  [^String id]
  (let [result {:code 200 :status "error" :message "delete success"}
        user (session/get :userid)
        post (and user (valid-number? id) (pbd/id id))]
    (cond
      (not user)
        (assoc result :message (emsg :not-login))
      (not post)
        (assoc result :message (emsg :post-id-error))
      (not= user (:user_id post))
        (assoc result :message (emsg :not-own))
      :else
        (do
          (pdb/delete! (Long/valueOf id))
          (assoc result :status "ok")))))
Run Code Online (Sandbox Code Playgroud)