2024 Clojure 状态调查! 中分享您的想法。

欢迎!请参阅 关于 页面了解有关此功能的更多信息。

+2
错误
当前在 {{: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

3 个回答

0
评论者:coltnz_

所采用的方案与描述中提倡的方法不同之处在于无需地图。


  

实际上变为:


  


其中assert-msg是一个字符串。注意,这意味着在表达式之后(可能有误)的第二个字符串将被视为真值的pre-expr。

人为示例


         
         


user=> (print-if-alphas-and-nums "a5%")
a5%
nil
user=> (print-if-alphas-and-nums "$$%")
AssertionError Assert failed: No alphas
(hasAlpha arg)  user/print-if-alphas-and-nums (NO_SOURCE_FILE:19)


我已经考虑将规范进一步扩展到(pre-expr assert-msg? data-map)*,可能由assert-info中的assert-data和ex-data类似物支持以传达诊断信息(局部变量?)。一个地图可以包含一个:msg键,或许地图是附加到消息字符串之外。但我想在此做一些等待。

我还考虑了允许在消息中允许将%替换为函数返回值,如在:post conds中,但如何进行转义?

 

0

评论者:coltnz

我应该指出,测试还包括当前未发现的现有功能。

0
参考:https://clojure.atlassian.net/browse/CLJ-1817(由alex+import报告)
...