gpt4 book ai didi

clojure - 何时需要声明命名空间的使用,何时不需要?

转载 作者:行者123 更新时间:2023-12-02 17:18:40 24 4
gpt4 key购买 nike

我有两个“lein”项目,在两个测试文件中具有完全相同的代码段:

... clojure.set/union ...

第一个项目编译并成功运行。第二个错误是:

Exception in thread "main" java.lang.ClassNotFoundException: clojure.set, compiling:(foo/bar.clj:14)
...
Caused by: java.lang.ClassNotFoundException: clojure.set
...

只有在 bar.clj 中添加显式 :use 才能运行第二个项目

(:use clojure.set)

第一个项目没有这个声明。为什么会有不同的行为?

更新:

未发生异常的第一个项目在 project.clj 中具有以下声明:

:eval-in-leiningen true

最佳答案

如果您希望本地符号引用该 namespace 中的名称,则只需声明 namespace 的使用。否则,您可以拼写出要使用的每个变量的全名。参见http://clojure.org/namespaces首页

普通函数通常存储在 var 中,您可以通过完整拼写名称 (clojure.core/+ 1 2) 或通过引发符号来访问它们在封闭的命名空间中引用它。作为示例,我们可以从一个名为 bar 的完全空白的命名空间开始。它甚至不会从其中的核心 Clojure 函数开始:

foo> (in-ns 'bar)
#<Namespace bar>
bar> (+ 1 2)
CompilerException java.lang.RuntimeException: Unable to resolve symbol: + in this context, compiling:(NO_SOURCE_PATH:1)

不过,如果我们拼出包含它的 var 的全名,我们就可以使用 + 函数。

bar> (clojure.core/+ 1 2)
3

然后你可以通过调用 refer 使符号 + 引用与 clojure.core 中相同的变量

bar> (clojure.core/refer 'clojure.core)
nil
bar> (+ 1 2)
3

<小时/>至于您的错误,这样的情况往往会发生在:

  • 您在该命名空间中从 REPL 运行了(use 'clojure.set)(require 'clojure.set)
  • 从 clojure.set 调用函数的代码实际上并未被调用,导致您看不到错误。
  • 它是在一个项目的文件顶部的 (ns foo.bar (:use clojure.clj)) 表单中声明的​​,而不是在另一个项目中声明

关于clojure - 何时需要声明命名空间的使用,何时不需要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14077413/

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