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

Eli*_*der 10 clojure assertions

我理解Clojure的*assert*变量可以用来关闭断言,但我做的事似乎没有用.

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

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

(binding [*assert* false]
  (foo -2))
!! exception
Run Code Online (Sandbox Code Playgroud)

甚至false在定义时绑定也有同样的问题:

(binding [*assert* false]
  (defn bar [a]
    {:pre [(pos? a)]}
    (assert (even? a))
    [a]))

(bar 1)
!! execption
Run Code Online (Sandbox Code Playgroud)

然后甚至直接设置变量也不起作用.

*assert*
is true

(alter-var-root (var *assert*) not)
*assert*
is still true
Run Code Online (Sandbox Code Playgroud)

(var-set (var *assert*) false)
*assert*
is still true
Run Code Online (Sandbox Code Playgroud)

所以现在我不明白该怎么做.我很迷惑.

谢谢.

cgr*_*and 13

*assert*是一个编译时变量,而不是运行时变量.它意味着set!作为顶级语句使用,而不是绑定(当然除非你eval在绑定内部调用).