2013-06-30 16 views
8

Tôi có số này (not (some #(= (:length %1) 0) %)) làm hậu điều kiện. Được viết như thế này khá rõ ràng, nhưng khi điều kiện này không được đáp ứng, tôi nhận được điều này:Tôi có thể đưa tin nhắn vào trước và sau điều kiện

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

Điều này không dễ đọc. Có cách nào để xác định thông điệp cho một điều kiện hay điều kiện tiên quyết không?

Sửa 1:

Sau noahlz và gợi ý noisesmiths, (nhưng sử dụng một hàm có tên bên ngoài):

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

cho:

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

Đó là rất nhiều rõ ràng hơn.

Trả lời

7

Điều này được thảo luận trong danh sách gửi thư clojure sau đây thread.

Nhìn vào clojure.core source bạn sẽ nhìn thấy vĩ mô fn chỉ đi trong một boolean đến chức năng khẳng định, và không bao gồm một tham số tùy chọn để thông qua một cuộc tranh cãi nhắn bổ sung trong.

Vì vậy, nó trông giống như không có cách nào để làm điều này một cách rõ ràng.

+0

Đó là chủ đề hai năm rưỡi, và không được nhận xét về bất cứ ai với bất kỳ quyền ra quyết định. Tôi sẽ không nói rằng tính năng này đang được xem xét để đưa vào. – amalloy

+0

Dường như giải pháp là không sử dụng nhiều tên hàm mô tả hơn trong các xác nhận của bạn (không phải các hàm nội tuyến). – noahlz

+0

Cập nhật câu trả lời để phản ánh những gì amalloy ghi nhận. –

2

mở rộng trên một gợi ý ở trên:

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

khi bạn đặt tên cho một chức năng ẩn danh, bất kỳ lỗi nào liên quan đến fn rằng sẽ dễ đọc hơn

cũng có, thế nào là nó mà bạn có hai% thay thế ở trên không? #() không làm tổ.

+0

% trong một postcondition cho giá trị trả về của hàm. Một lý do khác để sử dụng '(fn ...)' thay vì '# (...)' tôi đoán vậy. – snowape

2

post trong cùng một chuỗi đề xuất sử dụng macro clojure.test/là macro trả về một thông báo lỗi có ý nghĩa.

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

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

(get-key [] 0) 

lợi nhuận

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!") 
Các vấn đề liên quan