(defn string-to-string [s1]
{:pre [(string? s1)]
:post [(string? %)]}
s1)
我喜欢使用 :pre 和 :post 条件,它们可以帮助我更快地发现自己是否把“方块钉子放入圆孔”了。也许这是错误的,但我喜欢将它们作为一种简单的类型检查器。虽然这不是哲学问题,但这是一个简单的问题。
从上面的代码看来,我应该很容易地确定 s1
是函数参数在 :pre
条件中的变量名。类似地,%
在 :post
条件中总是函数返回值。
我的希望是,在 AssertionError 中打印出 s1
或 %
的值,以便当相应条件失败时能够得到类似以下的输出:
(string-to-string 23)
AssertionError Assert failed: (string? s1)
(pr-str s1) => 23
通过AssertionError包含一个单独的行,其中列出了从函数参数列表中识别并在失败的测试中引用的每个变量。当函数的返回值未能满足:post条件时,我也希望有类似的输出。
这将使我轻松快速地发现我在从AssertionError进行诊断时如何误用函数。它至少会让我知道值是nil
还是实际值(这是我常犯的错误)。
我有一些想法,可以通过宏来实现这一点,但我想知道是否有任何安全和全局的方法来重新定义(defn
和(fn
等函数,以便:pre
和:post
也会打印导致测试失败的值。