更可读的消息:pre和:post?

Geo*_*mms 5 contracts clojure

在我正在使用的clojure中:就像这样

user=> (defn cannot-take-empty [x] {:pre [((complement empty?) x)]} 1)
#'user/cannot-take-empty
user=> (cannot-take-empty #{})
AssertionError Assert failed: ((complement empty?) x)  user/cannot-take-empty (NO_SOURCE_FILE:186)
Run Code Online (Sandbox Code Playgroud)

这很好,但它没有解释为什么传递空集合没有意义的商业原因.(或者包含五个以上元素的集合,或者存在两个密钥而不是另一个密钥的集合,或者当天的规则.)如果前置条件使用私有函数,这对用户来说可能更加混乱.

有没有办法向用户提供更有用的反馈,如错误信息,使用时:pre和:post?

Leo*_*hin 4

显然,前置条件和后置条件是为报告条款向开发人员提供足够信息的用例而设计的,即它是不言自明的。如果您想提供更多解释,通常使用assert

但是您可以滥用这样的事实:整个情况总是被报告,例如:

{:pre [(do "It can't be empty because of..."
           (seq x))]}
Run Code Online (Sandbox Code Playgroud)

它会报告类似的内容

AssertionError 断言失败:(执行“它不能为空,因为...”(seq x))...