Clojure 将内置高级fn返回的函数标记为常量失败

Clojure 将内置高级fn返回的函数标记为常量失败,clojure,Clojure,我定义了一个不应该更改的函数,所以我想我可以使用const meta来限制它。在我使用生成另一个函数的内置高级函数之前,它一直运行良好 snitch.core=> (defn gen-foo [] (fn [_] true)) #'snitch.core/gen-foo snitch.core=> (def ^:const foo (gen-foo)) #'snitch.core/foo snitch.core=> (foo 1) true snitch.core=>

我定义了一个不应该更改的函数,所以我想我可以使用const meta来限制它。在我使用生成另一个函数的内置高级函数之前,它一直运行良好

snitch.core=> (defn gen-foo [] (fn [_] true))
#'snitch.core/gen-foo
snitch.core=> (def ^:const foo (gen-foo))
#'snitch.core/foo
snitch.core=> (foo 1)
true

snitch.core=> (def ^:const foo (every-pred even?))
#'snitch.core/foo
snitch.core=> (foo 1)
IllegalArgumentException No matching ctor found for class clojure.core$every_pred$ep1__6420  clojure.lang.Reflector.invokeConstructor (Reflector.java:163)

snitch.core=> (def ^:const foo (constantly 3))
#'snitch.core/foo
snitch.core=> (foo)
IllegalArgumentException No matching ctor found for class clojure.core$constantly$fn__4085  clojure.lang.Reflector.invokeConstructor (Reflector.java:163)
我被错误消息弄糊涂了


还有为什么我定义的函数可以使用,但内置函数生成的函数不能使用?

您误解了
:const
元数据的含义。在Clojure中,所有变量都是持久的,不能更改

:Clojure中的const
元数据的工作原理与
C++
中的
inline
指令非常相似,它告诉Clojure在编译过程中用其值替换变量,而不是在运行时取消引用它


请看

然后我也可以将正则表达式模式标记为const,对吗?