clojure中未绑定的函数-如何绑定它们?
我正在尝试在storm服务器上部署拓扑,它不断告诉我以下信息:clojure中未绑定的函数-如何绑定它们?,clojure,apache-storm,Clojure,Apache Storm,我正在尝试在storm服务器上部署拓扑,它不断告诉我以下信息: java.lang.RuntimeException: java.lang.IllegalStateException: Attempting to call unbound fn: #'storm-nblabla/operation-bolt__ at backtype.storm.clojure.ClojureBolt.prepare(ClojureBolt.java:60) a 所以我想我必须绑定一个我在prepare函数中
java.lang.RuntimeException: java.lang.IllegalStateException: Attempting to call unbound fn: #'storm-nblabla/operation-bolt__ at backtype.storm.clojure.ClojureBolt.prepare(ClojureBolt.java:60) a
所以我想我必须绑定一个我在prepare函数中使用的函数。所以我的问题是如何在clojure中绑定函数
问候,
Horace在clojure中,值通常以以下两种方式之一绑定:
- 局部变量,不带命名空间限定符(通常在
语句或let
/fn
args中)循环
这适用于未在块范围外引用的值(除非它们作为块内函数的参数或块的返回值提供) - 具有名称空间作用域的变量,通常使用
(或类似def
)的辅助宏defn
这适用于应可在命名空间范围内访问的值,这些值可在任何可以访问命名空间的地方访问
declare
创建var,然后在未提供真实定义的情况下调用它而导致的:
user> (declare foo)
#'user/foo
user> (foo)
IllegalStateException Attempting to call unbound fn: #'user/foo clojure.lang.Var$Unbound.throwArity (Var.java:43)
在此代码中,var存在(declare
created它),但没有赋值。
因此,您需要后一种绑定,即var绑定:
user> (defn foo [] "OK")
#'user/foo
user> (foo)
"OK"
user>
在某些地方,您的代码或您正在使用的库的代码的某些部分声明了一个var,它应该绑定到一个可调用的值,但尚未正确初始化。库是否有某种类型的
init
函数,而您没有调用它?在定义可见之前,可能需要一个名称空间?如果不看到代码,很难知道。