このSO postに続いて、関数の前提条件の値を出力したいと思います。ただし、次の場合は失敗します(おそらく破壊):
私はdir?
ヘルパー関数を持っています(これをスキップしてください):
(defn dir? [s]
"returns true if the string passed is is an existing directory"
(->> (clojure.java.io/file s)
((juxt #(.exists %) #(.isDirectory %)))
(every? true?)))
それは問題なく動作し、is
マクロを使用すると、テストと渡されたパラメーターの両方を確認できるいくつかの素晴らしいエラーメッセージが表示されます。
(is (dir? (io/file "resources/static"))) ;; => true
(is (dir? (io/file "resources/statice"))) ;; typo, error below
clojure.lang.PersistentList$EmptyList@1 (boot.user4515592986834245937.clj:86) で失敗: (dir? (io/file "resources/statice")) 実際: (not (dir? #object[java.io.ファイル 0x6730a420 "resources/statice"]))
ただし、前提条件で使用しようとすると:pre
、醜いエラーが発生します。
(defn make-something
[&{:keys [dir]
:or {dir "default-dir"}}]
{:pre [(is (dir? (clojure.java.io/file dir)))]}
;;... do something with these
)
(make-something :dir "resources/statices") ;; doesn't exist
clojure.lang.Compiler$CompilerException: java.lang.AssertionError: アサートに失敗しました: (is (dir? (io/file dir)))、コンパイル中:(boot.user4515592986834245937.clj:80:12) java.lang.AssertionError:アサートに失敗しました: (is (dir? (io/file dir)))
上記のようなエラーメッセージを関数で取得するにはどうすればよいですか?
念のため、Clojure 1.7 を使用しています。