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

时间:2013-10-25 09:05:00

标签: clojure apache-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

所以我想我必须在 准备 函数中绑定我正在使用的函数。所以我的问题是你如何在clojure中绑定函数?

此致

1 个答案:

答案 0 :(得分:11)

在clojure中,值通常以两种方式之一绑定:

  • 本地人,没有名称空间限定符(通常在let语句或fn / loop args)
    这适用于未在块范围之外引用的值(除非它们作为块内部函数或块的返回值的参数提供)。

  • vars,具有命名空间范围,通常使用def(或像defn这样的辅助宏) 这适用于应在命名空间范围内访问的值,只要您可以访问命名空间,就可以访问这些值。

错误(尝试调用未绑定的fn)是由于使用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已创建它),但未分配任何值。 所以你需要后一种绑定,一种var绑定:

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

某处,您的代码的某些部分或您正在使用的库的代码声明了一个var,它应绑定到可调用的值,但尚未正确初始化。该库是否具有您未调用的某种init函数?在定义可见之前,您可能需要命名空间吗?