gpt4 book ai didi

clojure - 如何让 Clojure 尊重 `*assert*` 变量?

转载 作者:行者123 更新时间:2023-12-04 03:13:25 26 4
gpt4 key购买 nike

我理解 Clojure 的 *assert*变量可用于关闭断言,但我所做的一切似乎都不起作用。

(defn foo [a]
{:pre [(pos? a)]}
(assert (even? a))
[a])

(binding [*assert* false]
(foo 1))
!! exception

(binding [*assert* false]
(foo -2))
!! exception

甚至绑定(bind) false当定义有同样的问题时:
(binding [*assert* false]
(defn bar [a]
{:pre [(pos? a)]}
(assert (even? a))
[a]))

(bar 1)
!! execption

然后即使直接设置变量也不起作用。
*assert*
is true

(alter-var-root (var *assert*) not)
*assert*
is still true


(var-set (var *assert*) false)
*assert*
is still true

所以现在我不明白该怎么做。我很困惑。

谢谢你。

最佳答案

*assert*是编译时变量,而不是运行时变量。它适用于 set!作为顶级语句,而不是绑定(bind)(当然,除非您在绑定(bind)中调用 eval)。

关于clojure - 如何让 Clojure 尊重 `*assert*` 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4874517/

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