The way I approach it is to make use of the Design By Contract features Clojure took from Eiffel. I almost never want to restrict an input to a function to a specific type or interface. I want it to conform to some kind of contract. So you build the :pre clause to reflect what kind of input you want. Sometimes I add a :post clause to ensure the function has performed correctly.<p>What does annoy me though (and you can see it clearly reflected in the survey respondents putting such a weight on better error messages) is the way assertions don&#x27;t give me a traceback (or file name and line number of the assertion).<p><a href="http:&#x2F;&#x2F;blog.fogus.me&#x2F;2009&#x2F;12&#x2F;21&#x2F;clojures-pre-and-post&#x2F;" rel="nofollow">http:&#x2F;&#x2F;blog.fogus.me&#x2F;2009&#x2F;12&#x2F;21&#x2F;clojures-pre-and-post&#x2F;</a>