当前在 {{:pre}} 或 {{:post}} 条件列表中的一个谓词失败会导致显示类似于以下的信息
(defn must-be-a-map [m] {:pre [(map? m)]} m)
(must-be-a-map [])
;;=> AssertionError 断言失败:(map? m) user/must-be-a-map (源文件...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 (源文件...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