【问题标题】:unbound functions in clojure - How to bind them?clojure 中的未绑定函数 - 如何绑定它们?
【发布时间】:2013-10-25 09:05:00
【问题描述】:

我正在尝试在风暴服务器上部署拓扑,但它不断告诉我以下信息:

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 中绑定函数?

问候,

贺拉斯

【问题讨论】:

  • 不看代码很难知道。

标签: clojure apache-storm


【解决方案1】:

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

  • locals,没有命名空间限定符,(通常在 let 语句或 fn / loop 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 创建了它),但没有分配任何值。 所以你需要后一种绑定,一个 var 绑定:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 2019-05-30
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 2010-12-04
    • 2012-09-29
    相关资源
    最近更新 更多