2013-10-25 47 views
6

我想部署一个风暴服务器上的拓扑,并不断告诉我下面的:clojure中的未绑定函数 - 如何绑定它们?

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 

所以我想我有绑定,我使用的准备功能的功能。所以我的问题是,你如何在clojure中绑定函数?

问候,

贺拉斯

+0

很难知道没有看到代码。 – Chiron

回答

11

Clojure中,一个值通常必将在以下两种方法之一:

  • 当地人,没有命名空间限定词,(通常在let陈述或fn/loop args)
    这是针对未在块范围之外引用的值(除非它们作为函数的参数提供块内部或块的返回值)。

  • 瓦尔,命名空间范围,通常使用def(或类似defn辅助宏)
    这是价值观,应该是在命名空间内,这将是访问的地方,你可以访问该命名空间访问。

错误(试图调用未绑定FN)通过使用declare创建一个变种,然后调用它没有提供真正的定义引起的:

user> (declare foo) 
#'user/foo 
user> (foo) 
IllegalStateException Attempting to call unbound fn: #'user/foo clojure.lang.Var$Unbound.throwArity (Var.java:43) 

在这段代码的变种存在(declare创建它),但没有赋值。 所以你需要后一种的结合,一个VAR结合:

user> (defn foo [] "OK") 
#'user/foo 
user> (foo) 
"OK" 
user> 

某处,你的代码的某些部分或正在使用已申报变种库的代码,这应该绑定到一个可调用值,但尚未正确初始化。图书馆有没有调用某种init函数?也许在定义可见之前需要一个命名空间?