为什么我不能在REPL之后引用(defrecord Foo [bar])的结果(load-file"foofile.clj")?

twn*_*ale 2 clojure

我的文件看起来像这样,或多或少:

(ns foofile)

(defprotocol foo-protocol 
  "foo(lish example)"
  (foo-method [this] "foo docs")

(defrecord Foo [biz])

(def foo (Foo. "baz"))
Run Code Online (Sandbox Code Playgroud)

我启动REPL并输入

(load-file "foofile.clj")
Run Code Online (Sandbox Code Playgroud)

它打印出来

#'foofile/foo
Run Code Online (Sandbox Code Playgroud)

现在我可以参考foofile/foo和foofile/foo-protocol,但是当我尝试foofile/Foo时,我得到了

java.lang.Exception: No such var: foofile/Foo (NO_SOURCE_FILE:0)
Run Code Online (Sandbox Code Playgroud)

如果我手动输入REPL(具体来说,我遵循这篇博文),相同(或基本相似)的代码只是花花公子.这里发生了什么?在REPL和加载文件之间有什么不同?

Ger*_*ert 5

你需要导入Foo,因为它是一个java类:

(import 'foofile.Foo)
Run Code Online (Sandbox Code Playgroud)

在repl中输入代码时它起作用的原因是,当你引用Foo(可能是命名空间user)时,你在同一名称空间中声明了Foo .