标记由内置高级fn返回的函数,因为const失败

时间:2015-03-16 09:00:11

标签: 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=> (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)

我对错误信息感到困惑。

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

1 个答案:

答案 0 :(得分:2)

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

Clojure中的

:const元数据与inline中的C++指令非常相似,告诉Clojure在编译期间将变量替换为其值,而不是在运行时取消引用它。

请参阅How does Clojure ^:const work?