Clojure中未绑定的函数 - 如何绑定它们?

6

我正在尝试在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函数中使用的函数。那么我的问题是,你通常如何在Clojure中绑定函数?

谢谢,

霍雷斯


没有看到代码很难知道。 - Chiron
1个回答

12

在Clojure中,一个值通常有两种绑定方式:

  • 本地变量,没有命名空间限定符(通常在let语句或fn / loop参数中)
    这是为那些不会超出块作用域的值而设定的(除非它们作为块内函数的参数或块的返回值提供)。

  • 具有命名空间范围的变量,通常使用def(或类似defn的二级宏)
    这是为应该在命名空间范围内可访问的值而设定的,在您可以访问命名空间的任何地方都可以访问。

尝试调用未绑定的函数时发生错误,这是由于使用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创建),但是还没有被赋值。所以你需要后一种类型的绑定,即变量绑定:

<p>在这段代码中,变量已经存在(由<code>declare</code>创建),但是还没有被赋值。所以你需要后一种类型的绑定,即变量绑定:</p>

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

在某个地方,你的代码或你使用的库的代码声明了一个变量,应该将其绑定到可调用的值,但未被正确初始化。这个库是否有某种类型的init函数你没有调用?也许有一个命名空间在定义可见之前需要被引用?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接