3

この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 を使用しています。

4

1 に答える 1

1

コードを確認する必要があります (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)
于 2016-03-16T16:58:10.687 に答える