当 {{:pre}} 或 {{:post}} 条件列表中的谓词失败时,将显示与以下类似的消息
(defn must-be-a-map [m] {:pre [(map? m)]} m)
(must-be-a-map [])
;;=> AssertionErrorAssert failed: (map? m) user/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 Assert failed: m must be a map due to some domain specific reason.
(map? m) user/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]
http://wiki.science.ru.nl/tfpie/images/2/22/TFPIE2013_Steps_Towards_Teaching_Clojure.pdf