(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.