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

Clojure中,一個值通常必將在以下兩種方法之一:

  • 當地人,沒有命名空間限定詞,(通常在let陳述或fn/loop args)
    這是針對未在塊範圍之外引用的值(除非它們作爲函數的參數提供塊內部或塊的返回值)。

  • 瓦爾,命名空間範圍,通常使用def(或類似defn輔助宏)
    這是價值觀,應該是在命名空間內,這將是訪問的地方,你可以訪問該命名空間訪問。

錯誤(試圖調用未綁定FN)通過使用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創建它),但沒有賦值。 所以你需要後一種的結合,一個VAR結合:

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

某處,你的代碼的某些部分或正在使用已申報變種庫的代碼,這應該綁定到一個可調用值,但尚未正確初始化。圖書館有沒有調用某種init函數?也許在定義可見之前需要一個命名空間?