2013-10-25 12 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

は、値は通常、2つの方法のいずれかで拘束されています。通常let声明の中で(、名前空間修飾子なしで、

  • 地元の人々やfn/loop args)
    これは、ブロックのスコープ外で参照されない値です(funcの引数として指定されている場合を除きます)ブロックの内部またはブロックの戻り値)を返します。通常def(またはdefnのような二次的なマクロ)を使用して、名前空間スコープを持つ

  • VARS、
    これは、名前空間にアクセスできる場所にアクセスできるようになる、名前空間スコープでアクセス可能であるべき値のためです。

エラー(未結合のFNを呼び出そうと)VARを作成するために、declareを使用することによって引き起こされ、その後、真の定義を与えることなく、それを呼んでいる。このコードで

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必要があります。どこかで、あなたのコードや使用しているライブラリのコードの一部は、呼び出し可能な値にバインドする必要があるVARを、宣言した

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

をしかし、適切に初期化されていません。ライブラリには、あなたが呼び出していない何らかの種類の関数initがありますか?おそらく、定義が見えるようにするために必要な名前空間がありますか?

関連する問題