【问题标题】:Clojure error: Unable to resolve symbol: update in this contextClojure 错误:无法解析符号:在此上下文中更新
【发布时间】:2018-09-18 07:14:50
【问题描述】:

这是我从本网站另一篇帖子的答案中复制的代码:

(def data [[1 1 1 3] [2 2 2 3] [3 2 1 1] [4 3 3 4]])
(def replacements {1 "joe" 2 "fred" 3 "martha"})

(defn test
[]
    (mapv (fn [row] (update row 1 replacements)) data)
)

当我在 REPL 中调用 (test) 时,它显示以下错误:

CompilerException java.lang.RuntimeException: Unable to resolve symbol: update in this context

为什么 Clojure 不知道更新函数?

【问题讨论】:

  • 检查您使用的 Clojure 版本。在 1.7 中添加了更新
  • 如果你在update-in(例如(update-in row [1] replacements)

标签: clojure


【解决方案1】:

如果您从 clojure 1.6 或更早版本调用 update,则会收到此错误。

update 是在 1.7 中添加的,在此之前您必须使用 update-in

试试(clojure-version),看看你在用什么。

(正如 cfrick 和 dpassen 在 cmets 中所说的那样)

【讨论】:

    【解决方案2】:

    尝试重新启动 repl。当我尝试它时它会起作用:

    (def data [[1 1 1 3] [2 2 2 3] [3 2 1 1] [4 3 3 4]])
    (def replacements {1 "joe" 2 "fred" 3 "martha"})
    (defn test []
      (mapv (fn [row] (update row 1 replacements)) data) )
    
    (test) => [[1 "joe" 1 3] [2 "fred" 2 3] [3 "fred" 1 1] [4 "martha" 3 4]]
    

    另一个选项(我最喜欢的)是在临时测试命名空间(例如tst.demo.core)中处理此类代码,这样您就可以使用完整的编辑器,并且更容易确保所有内容都正确加载/重新加载。

    我也强烈推荐lein-test-refresh plugin for lein.

    另一种选择是创建一个新的空目录并在那里启动一个 repl:

    ~/expr > mkdir sally
    ~/expr > cd sally
    ~/expr/sally > lein repl
    user=> (def data [[1 1 1 3] [2 2 2 3] [3 2 1 1] [4 3 3 4]])
    #'user/data
    user=> (def replacements {1 "joe" 2 "fred" 3 "martha"})
    #'user/replacements
    user=> (defn test []
      #_=>   (mapv (fn [row] (update row 1 replacements)) data) )
    WARNING: test already refers to: #'clojure.core/test in namespace: user, being replaced by: #'user/test
    #'user/test
    user=> (test)
    [[1 "joe" 1 3] [2 "fred" 2 3] [3 "fred" 1 1] [4 "martha" 3 4]]
    

    更新

    请注意,在 Clojure 中,文件名和目录结构必须与每个文件中的命名空间声明相匹配。因此像./src/fred/core.clj这样的文件必须有一个像fred.core这样的命名空间,其中./src是主项目目录的子目录(project.clj所在的位置)。

    【讨论】:

    • 我重启了 Eclipse 还是不行。这是否与我将 a3.core 命名空间重命名为 (ns a3.menu) 的事实有关?抱歉,我对 Clojure 很陌生
    • 如果您没有更改 (ns a3.core ...) 声明以匹配新文件名,则很有可能;查看更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多