gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:51:01 25 4
gpt4 key购买 nike

我正在尝试在 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

所以我想我必须绑定(bind)一个我在 中使用的函数。准备功能。所以我的问题是你通常如何在 clojure 中绑定(bind)函数?

问候,

贺拉斯

最佳答案

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

  • locals,没有命名空间限定符,(通常在 let 语句或 fn/loop args 中)
    这适用于未在 block 范围之外引用的值(除非它们作为参数提供给 block 内的函数或 block 的返回值)。
  • vars,具有命名空间范围,通常使用 def (或像 defn 这样的二级宏)
    这适用于应该在命名空间范围内可访问的值,无论您可以访问命名空间的任何地方都可以访问这些值。

  • 错误(试图调用未绑定(bind)的 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 创建了它),但没有赋值。
    所以你需要后一种绑定(bind),一个 var 绑定(bind):
    user> (defn foo [] "OK")
    #'user/foo
    user> (foo)
    "OK"
    user>

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

    关于clojure - clojure 中的未绑定(bind)函数 - 如何绑定(bind)它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19585577/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com