После этого SO post, я хотел бы напечатать значение предварительных условий в моей функции. Однако он не для меня в следующем случае (вероятно деструктурирующий):Clojure: предварительное сообщение об ошибке при деструкции
У меня есть 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 [email protected] (boot.user4515592986834245937.clj:86) expected: (dir? (io/file "resources/statice")) actual: (not (dir? #object[java.io.File 0x6730a420 "resources/statice"]))
Однако, при попытке использовать I т в предпосылке :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: Assert failed: (is (dir? (io/file dir))), compiling:(boot.user4515592986834245937.clj:80:12) java.lang.AssertionError: Assert failed: (is (dir? (io/file dir)))
Как я могу получить сообщение об ошибке хорошего в моей функции так же, как один из приведенной выше?
В случае, если это имеет значение, я использую Clojure 1.7.
Сообщение об ошибке «nice» должно быть напечатано в выводе. – DanLebrero
memfn был лишен pre clojure 1.0, форма # (.Directory ...) более нормальная сейчас –
@ArthurUlfeldt О, интересно, я не видел этого нигде. Откуда у вас такая информация? Это не в источнике https://github.com/clojure/clojure/blob/clojure-1.7.0/src/clj/clojure/core.clj#L3717 – nha