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

时间:2015-06-06 20:35:32

标签: clojure contracts

在clojure中我正在使用:pre like this

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)

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

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

1 个答案:

答案 0 :(得分:4)

显然,前置和后置条件是针对用户使用而设计的,其中报告条款向开发者提供了足够的信息,即它是不言自明的。如果您希望提供更多说明,请务必使用assert

但你可以滥用这样一个事实,即总是报告整个情况,例如:像这样:

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

它会报告类似

的内容
  

断言错误断言失败:(执行“由于...不能为空”   (seq x))......