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

kqhtkvqz  于 2021-06-24  发布在  Storm
关注(0)|答案(1)|浏览(450)

我正在尝试在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中绑定函数?
当做,
贺拉斯

kgqe7b3p

kgqe7b3p1#

在clojure中,值通常以以下两种方式之一绑定:
局部变量,没有名称空间限定符(通常在 let 声明或 fn / loop 参数)
这适用于未在块范围外引用的值(除非它们是作为块内函数的参数或块的返回值提供的)。
具有命名空间作用域的变量,通常使用 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,该var应该绑定到一个可调用的值,但尚未正确初始化。图书馆有图书馆吗 init 你没调用过的函数?在定义可见之前,可能需要一个名称空间?

相关问题