我的文件看起来像这样,或多或少:
(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和加载文件之间有什么不同?
你需要导入Foo,因为它是一个java类:
(import 'foofile.Foo)
Run Code Online (Sandbox Code Playgroud)
在repl中输入代码时它起作用的原因是,当你引用Foo(可能是命名空间user)时,你在同一名称空间中声明了Foo .