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)

キーワード