在这篇SO帖子之后,我想在我的函数中打印前提条件的值。但是,在以下情况下(可能是解构),它对我来说失败了:
我有一个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
FAIL in clojure.lang.PersistentList$EmptyList@1 (boot.user4515592986834245937.clj:86) 预期:(目录?(io/文件 "resources/statice")) actual: (not (dir? #object[java.io.File 0x6730a420 "资源/静态"]))
但是,当尝试在前提条件: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: 断言失败:(是(目录?(io/file dir))), 编译:(boot.user4515592986834245937.clj:80:12) java.lang.AssertionError: Assert failed: (is (dir?(io/file dir)))
我怎样才能在我的函数中获得一个很好的错误消息,就像上面一样?
万一重要,我使用的是Clojure 1.7。
你需要检查你的代码(dir?
函数)。以下片段对我有用:
(require '[clojure.java.io :as io])
(defn dir? [s]
(let [dir (io/file s)]
(and (.exists dir)
(.isDirectory dir))))
(defn make-something
[& {:keys [dir] :or {dir "default-dir"}}]
{:pre [(is (dir? dir))]}
(println dir))
(make-something :dir "/tmp")
out => /tmp
ret => nil
(make-something :dir "/xxxx")
FAIL in clojure.lang.PersistentList$EmptyList@1 (form-init3332271312167175068.clj:1)
expected: (dir? dir)
actual: (not (dir? "/xxxx"))
AssertionError Assert failed: (is (dir? dir)) user/make-sth (form-init3332271312167175068.clj:1)