2013-06-30 10 views
8

私はこれを後条件として(not (some #(= (:length %1) 0) %))としています。このように書かれて、それはかなり明らかだが、この条件が満たされないとき、私はこの取得:非常に読みやすいではありません前条件と事後条件にメッセージを含めることができます

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

を。事後条件や前提条件のメッセージを定義する方法はありますか?

編集1:

(外部という名前の関数が、使用して)、noahlzとnoisesmiths提案後:

(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})) 

が与える:

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

たくさん明確です。

答えて

7

これは、以下のクロージャーメーリングリストthreadで説明されています。あなたは、fnマクロだけassert関数にブール値を渡し、そして、追加のメッセージ引数を渡すためのオプションのパラメータが含まれていません見ることができますclojure.core sourceを見てみると

だから、のように見えますこれをきれいに行う方法はまだありません。

+0

。私はこの機能が含まれているとは言いません。 – amalloy

+0

解決策のように見えますが、あなたのアサーション(インライン関数ではありません)でより多くの記述的な関数名を使用しないように見えます。 – noahlz

+0

amalloyが指摘したことを反映するように更新されました。事後条件の –

2

上記の提案に拡大:

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

あなたは匿名関数に名前を付けるとき、そのFNを含むすべてのエラーも

読みやすくなり、どのようにそれはあなたが上記の二つ%の置換を持っているということですか? #()はネストしません。

+0

%は関数の戻り値を与える。 '#(...)'の代わりに '(fn ...)'を使うもう一つの理由はそうだと思います。 – snowape

2

同じスレッド内のpostには、意味のあるエラーメッセージを返すclojure.test/isマクロの使用が示唆されています。スレッドは2歳半で、任意の意思決定権を持つ誰もが上のコメントしなかったことを

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

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

(get-key [] 0) 

戻り

FAIL in [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!") 
関連する問題