当前在 {{:pre}} 或 {{:post}} 条件的列表中的一个谓词失败会导致类似以下的消息显示
(defn must-be-a-map [m] {:pre [(map? m)]} m)
(must-be-a-map [])
;;=> AssertionError 断言失败:)(map? m) user/must-be-a-map (form-init.....clj:1)
通过允许将特定消息字符串与 {{:pre}} 和 {{:post}} 条件中的每个谓词关联起来,这些异常消息可以被显著提高描述性。
谓词函数及其相关消息字符串可以作为映射中的一个值对进行指定
(defn must-be-a-map
[m]
{:pre [{(map? m) "m 必须是一个映射,因为有一些特定的领域原因。"}]}
m)
以下将生成如下错误消息
(must-be-a-map 10)
AssertionError 断言失败:由于某些特定的领域原因,m 必须是一个映射。
(map? m) user/must-be-a-map (form-init.....clj:1)
这将允许在指定未见消息的谓词的同时,根据相关的谓词消息对来进行
(defn n-and-m [n m] {:pre [(number? n) {(map? m) "您必须提供一个映射!"}]})
此更改不会破坏现有功能,并且仍然允许在代码的其他地方预定义谓词。
因此,前提和后续条件可以提供自然地记录函数来龙去脉的手段,简化在开发库时提供有意义的输出过程,并可能使语言更适合教学环境[1]
[1]
http://wiki.science.ru.nl/tfpie/images/2/22/TFPIE2013_Steps_Towards_Teaching_Clojure.pdf