2013-10-25 5 views
6

bir fırtınanın sunucusunda bir topoloji dağıtmak çalışıyorum ve aşağıdaki söyleyip duruyor: clojure içindeki ayrılmamış işlevler - Nasıl bağlanır?

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 

yüzden ben fonksiyonunu hazırlamak yılında kullanıyorum bir işlevi bağlamak zorunda sanırım. Bu yüzden sorum şu: Genelde clojure'daki işlevleri nasıl bağlarsınız?

Selamlar,

Horace Clojure ise

+0

Kod görmeden bilmek zor. – Chiron

cevap

11

, bir değer genellikle iki yoldan biriyle bağlı olduğu: genellikle let açıklamada (bir ad alanı eleme olmadan

  • yerli veya fn/loop args)
    Bu, bloğun kapsamı dışında başvuruda bulunmayan değerler içindir (bunlar bir func argümanı olarak sağlanmışlarsa) bloğun içinde veya bloğun dönüş değerinde). ad kapsamı ile

  • vars, genellikle def (veya defn gibi ikincil bir makro)
    Bu ad erişebilir yerde erişilebilir olacaktır ad kapsamı, erişilebilir olmalıdır değerler içindir. var var Bu kodda

    user> (declare foo) 
    #'user/foo 
    user> (foo) 
    IllegalStateException Attempting to call unbound fn: #'user/foo clojure.lang.Var$Unbound.throwArity (Var.java:43) 
    

    :

hatası gerçek bir tanımı yapılmaksızın çağırmak sonra bir var oluşturmak için declare kullanarak ve neden olur (bir ilişkisiz fn ulaşmaya çalışıyorum) (declare bunu oluşturdu), ancak hiçbir değer atanmadı. Bir çağrılabilir değere bağlı olmalıdır

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

Somewhere Kodunuzla bir kısmını ya da bir var ilan etti kullandığınız kütüphanenin kodunu: Yani, bağlayıcı bir var bağlayıcı ikinci tür gerekir ancak doğru şekilde başlatılmamış. Kütüphanede aradığınız bir çeşit init işlevi var mı? Belki de tanım görmeden önce ihtiyaç duyacağınız bir ad alanı var mı?