gpt4 book ai didi

clojure - 如何获取Clojure:pre和:post报告其失败值?

转载 作者:行者123 更新时间:2023-12-03 10:24:54 25 4
gpt4 key购买 nike

(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以及 friend 所做的事情,以便 :pre:post也可以打印出导致测试失败。

最佳答案

您可以使用is中的 clojure.test 宏包装谓词

(defn string-to-string [s1] 
{:pre [(is (string? s1))]
:post [(is (string? %))]}
s1)

然后您得到:
(string-to-string 10)
;FAIL in clojure.lang.PersistentList$EmptyList@1 (scratch.clj:5)
;expected: (string? s1)
;actual: (not (string? 10))

关于clojure - 如何获取Clojure:pre和:post报告其失败值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24834116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com