assert
を使って事前条件と事後条件を表明するという契約プログラミング的なスタイルは Clojure においても実践可能でそれは次のように書くことが出来ます。
(defn foo [x]
{:pre [(map? x)]}
x)
(foo 1) ;; AssertionError Assert failed: (map? x)
(foo {:bar 10}) ;; {:bar 10}
とはいえ、これらは開発時に使いたいものであってプロダクション環境などでは動いてほしくないものです。
なのでこれを止めるようにします。
(defproject assert-test "0.1.0-SNAPSHOT"
:description "FIXME: write description"
:url "http://example.com/FIXME"
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:dependencies [[org.clojure/clojure "1.7.0"]]
:profiles
{:dev {:global-vars {*assert* true}}
:prod {:global-vars {*assert* false}}})
:global-vars
を設定するだけで良いです。例えば lein uberjar
するときに行いたいなら :uberjar
プロファイルに設定するなどでも良いと思います。