title: how to avoid nesting in clojure
body: <p>when my write a function to check a user can delete a post by clojure,I get this</p>
  
  <pre><code>(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)))))
  </code></pre>
  
  <p>so i want to fix it,i get this</p>
  
  <p><a href="https://github.com/4clojure/4clojure/blob/develop/src/foreclojure/register.clj#L27" rel="nofollow">https://github.com/4clojure/4clojure/blob/develop/src/foreclojure/register.clj#L27</a></p>
  
  <p><a href="https://github.com/4clojure/4clojure/blob/develop/src/foreclojure/utils.clj#L32" rel="nofollow">https://github.com/4clojure/4clojure/blob/develop/src/foreclojure/utils.clj#L32</a>
  but it is line,but not a nest.</p>
  
  <p>the <code>delete!</code> function is nest ugly and it is very hard to understand it,how to write a macro to avoid the nesting a lot.or other way to avoid it.</p>