2013-06-30 10 views
8

Mam to jako (not (some #(= (:length %1) 0) %)) jako post. Napisane w ten sposób jest całkiem jasne, ale gdy ten warunek nie jest spełniony, otrzymuję to:Czy mogę dołączyć wiadomość do warunków wstępnych i końcowych?

Assert failed: (not (some (fn* [p1__17852#] (= (:length p1__17852#) 0)) %)) 

Który nie jest bardzo czytelny. Czy istnieje sposób zdefiniowania komunikatu dotyczącego warunku końcowego lub warunku wstępnego?

Edit 1:

Po noahlz i noisesmiths sugestii, (ale przy użyciu zewnętrznego funkcji o nazwie):

(defn not-zero-length 
    [evseq] 
    (not (some (fn [item] (= (:length item) 0)) evseq))) 

(defn my-func 
    [evseq] 
    {:post [(not-zero-length %)]} 
    evseq) 

(my-func '({:length 3}{:length 0})) 

daje:

AssertionError Assert failed: (not-zero-length %) 

Który jest dużo jaśniejsze.

Odpowiedz

7

Zostało to omówione na poniższej liście mailingowej clojure thread.

Patrząc na clojure.core source widać makro fn przechodzi tylko w logiczną do funkcji assert i nie zawierać opcjonalny parametr przekazywania dodatkowych wiadomość argumentu.

Tak to wygląda nie ma sposobu, aby to zrobić jeszcze czysto.

+0

Ten wątek jest dwa i pół roku życia, a nie została skomentowana przez każdego z każdej władzy decyzyjnej. Nie powiedziałbym, że ta funkcja jest rozważana do włączenia. – amalloy

+0

Wygląda na to, że nie należy używać bardziej opisowych nazw funkcji w twoich twierdzeniach (nie funkcje inline). – noahlz

+0

Zaktualizowana odpowiedź, aby odzwierciedlić to, co zauważył amalloy. –

2

rozwijając sugestii powyżej:

(not (some (fn zero-length [item] (= (:length item) 0)) %)) 

kiedy wymienić anonimową funkcję, wszelkie błędy polegające że fn będzie bardziej czytelny

również, jak to jest, że masz dwa% podstawienia powyżej? #() nie zagnieździ się.

+0

% w warunku posta daje wartość zwracaną przez funkcję. Kolejny powód używania '(fn ...)' zamiast '# (...)' I guess. – snowape

2

Ten post w tym samym wątku sugeruje użycie makra clojure.test/is, który zwraca znaczący komunikat o błędzie.

(require '[clojure.test :refer [is]]) 

(defn get-key [m k] 
    {:pre [(is (map? m) "m is not a map!")]} 
    (m k)) 

(get-key [] 0) 

powraca

FAIL in clojure.lang.P[email protected] (form-init8401797809408331100.clj:2) 
m is not a map! 
expected: (map? m) 
    actual: (not (map? [])) 
AssertionError Assert failed: (is (map? m) "m is not a map!") 
Powiązane problemy