当前在 {{:pre}} 或 {{:post}} 条件列表中的谓词失败会导致类似以下的消息显示
(defn must-be-a-map [m] {:pre [(map? m)]} m)
(must-be-a-map [])
;;=> AssertionError 断言失败:1 (map? m) 用户/must-be-a-map (form-init.....clj:1)
通过允许将特定消息字符串与 {{:pre}} 和 {{:post}} 条件中的每个谓词相关联,可以显著增加异常消息的描述性。
谓词函数及其相关消息字符串可以用一个映射中的值对来指定
(defn must-be-a-map
[m]
{:pre [{(map? m) "m must be a map due to some domain specific reason."}]}
m)
然后这将产生以下错误消息
(must-be-a-map 10)
AssertionError 断言失败:m must be a map due to some domain specific reason.
(map? m) 用户/must-be-a-map (form-init.....clj:1)
这将允许指定不带消息的谓词,同时指定与其相关联的谓词消息对,如下所示
(defn n-and-m [n m] {:pre [(number? n) {(map? m) "You must provide a map!"}]})
此更改不会破坏任何现有功能,并仍然允许在代码中的其他地方预定义谓词。
因此,预置和后置条件可以提供进一步记录函数内外部的方法,简化在开发库时提供有意义输出的过程,也许使语言更适合教学环境[1]
[1]
http://wiki.science.ru.nl/tfpie/images/2/22/TFPIE2013_Steps_Towards_Teaching_Clojure.pdf