TL;DR
- Clojure には、引数と戻り値を検査するフック
:preと:postがあり、表明プログラミングができる。 - 条件を満たさないと
AssertionErrorを投げる。:postの中では%が戻り値を表す。
内容
Clojure には引数と戻り値をチェックするフック(:pre、:post)があり、表明プログラミングができる。
次は事前条件をセットした例である。
(defn sum [a b]
{:pre [(number? a) (number? b)]}
(+ a b))
(sum 4 5) ; 9関数本体の処理((+ 4 5))は、:pre で指定した条件をすべて満たす場合だけ実行される。条件を満たさないときは、例外を投げる。
(sum "4" 5)
;; java.lang.AssertionError: Assert failed: (number? a)次は事後条件をセットした例である。% は戻り値を表す。
(defn sum [a b]
{:post [(number? %)]}
"45"):post は、関数の実行が終わり、戻り値を返す直前に呼び出される。上のコードは戻り値が文字列型で条件を満たさないので、呼び出すと例外を投げる。
(sum 4 5)
;; java.lang.AssertionError: Assert failed: (number? %)事前条件と事後条件を組み合わせると、次のようになる。
(defn sum [a b]
{:pre [(number? a) (number? b)]
:post [(number? %)]}
(+ a b))次を実行すると事前条件に引っかかり、例外を投げる。
(sum "4" 5)
;; java.lang.AssertionError: Assert failed: (number? a)