Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
clojure中未绑定的函数-如何绑定它们?_Clojure_Apache Storm - Fatal编程技术网

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

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函数中

我正在尝试在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中绑定函数

问候,


Horace

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

  • 局部变量,不带命名空间限定符(通常在
    let
    语句或
    fn
    /
    循环
    args中)
    这适用于未在块范围外引用的值(除非它们作为块内函数的参数或块的返回值提供)

  • 具有名称空间作用域的变量,通常使用
    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
created它),但没有赋值。 因此,您需要后一种绑定,即var绑定:

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

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

如果不看到代码,很难知道。