2016-01-22 6 views
3

После этого 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.

+0

Сообщение об ошибке «nice» должно быть напечатано в выводе. – DanLebrero

+1

memfn был лишен pre clojure 1.0, форма # (.Directory ...) более нормальная сейчас –

+0

@ArthurUlfeldt О, интересно, я не видел этого нигде. Откуда у вас такая информация? Это не в источнике https://github.com/clojure/clojure/blob/clojure-1.7.0/src/clj/clojure/core.clj#L3717 – nha

ответ

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 [email protected] (form-init3332271312167175068.clj:1) 
expected: (dir? dir) 
actual: (not (dir? "/xxxx")) 

AssertionError Assert failed: (is (dir? dir)) user/make-sth (form-init3332271312167175068.clj:1) 
+0

Это потому, что я отредактировал код вручную после комментария Артура , Ваш код теперь работает в моей REPL, поэтому я принял ваш ответ (Clojure 1.8, хотя - я не тестировал с 1.7, как в моем первоначальном вопросе). – nha