将内置高级 fn 返回的函数标记为 const failed
mark a function returned by builtin hight-level fn as const failed
我定义了一个不应更改的函数,所以我想我可以使用 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 在编译期间用它的值替换变量,而不是在运行时取消引用它。
请参阅How does Clojure ^:const work?
我定义了一个不应更改的函数,所以我想我可以使用 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 中,所有变量都是持久的,不能更改。
:const
元数据与 C++
中的 inline
指令非常相似,告诉 Clojure 在编译期间用它的值替换变量,而不是在运行时取消引用它。
请参阅How does Clojure ^:const work?