I think a natural place of the :post condition shold be after the argument 
brackets (and that should be possible to implement I think):

(defn user-name [user :core/user] :user/name
  (-> user :user/name))


On Friday, September 16, 2016 at 1:34:47 PM UTC+2, joakim.t...@nova.com 
wrote:
>
> (ns spec-test.core
>   (:require [clojure.spec :as s]))
>
> (s/def :user/name string?)
> (s/def :core/user (s/keys :req [:user/name]))
>
> ; A helper method to get better error messages.
> ; Also imagine that clojure.spec has a similar s/check
> ; function that looks similar to this one
> ; (used in our user-name function):
> (defn check [type data]
>   (if (s/valid? type data)
>     true
>     (throw (AssertionError. (s/explain type data)))))
>
>
> ; ...how about if we could write our :pre and :post conditions like this:
> (defn user-name [user :core/user]
>   (-> user :user/name)) :user/name
>
> ; ...so that they expands into this:
> (defn user-name [user]
>   {:pre [(s/check :core/user user)]}
>   {:post [(s/check :user/name user)]}
>   (-> user :user/name))
>
>
>
> ; And if you have other :pre or :post conditions,
> ; then extend the existing ones:
> (defn user-name [user :core/user number]
>   {:pre [pos? number]}
>   (-> user :user/name))
>
> ; ...becomes:
> (defn user-name [user number]
>   {:pre [pos? number
>          (s/valid? :core/user user)]}
>   (-> user :user/name))
>
> ; a call to the function
> (user-name {:user/name "Bill"} 3)
>
>
> ; Maybe it will be hard to find a nice syntax that works for the post 
> condition,
> ; but the :pre condition should be doable I think!
>
>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to