编译器异常java.lang.RuntimeException: 无法解析符号: - [Clojure]

5

我有一个在guestbook.models.db 命名空间中的 save-message 函数,我试图在 repl 中运行它,但是遇到了这个错误:

guestbook.models.db> (save-message "A" "Hi"
                                   )
CompilerException java.lang.RuntimeException: Unable to resolve symbol: save-message in this context, compiling:(/private/var/folders/xc/ypy3lqhj08xg2hjc6g81qwl80000gn/T/form-init7598384514150426113.clj:1:1) 

我重新加载并再次尝试,但仍然出现相同的错误。

guestbook.models.db> (:reload 'guestbook.models.db)
nil
guestbook.models.db> (save-message "A" "Hi"
                                   )
CompilerException java.lang.RuntimeException: Unable to resolve symbol: save-message in this context, compiling:(/private/var/folders/xc/ypy3lqhj08xg2hjc6g81qwl80000gn/T/form-init7598384514150426113.clj:1:1) 
guestbook.models.db> 

我做错了什么吗?

1个回答

6

你希望表达的是

(require :reload 'guestbook.models.db)

这将重新加载单个命名空间;如果使用:reload-all,它还会递归重新加载guestbook.models.db直接或间接加载的所有命名空间。
详见(doc require)
至于(:reload 'guestbook.models.db)
在Clojure中,关键字在被用作函数时,会尝试把第一个参数当做一个映射,以查找它们自己。例如,(:foo {:foo 1})返回1。如果无法这样处理该参数,则返回nil。可选地,可以提供第二个参数,作为默认值,以防关键字不能在其第一个参数中找到对应自身的值(无论其是非映射还是没有此键的映射)。

当我尝试(require :reload 'guestbook.models.db)时,我得到了相同的错误:guestbook.models.db> (require :reload 'guestbook.models.db) CompilerException java.lang.RuntimeException: Unable to resolve symbol: require in this context, compiling:(/private/var/folders/xc/ypy3lqhj08xg2hjc6g81qwl80000gn/T/form-init7598384514150426113.clj:1:1) - Zeynel
1
这是关于“require”的内容。您如何在REPL中切换到“guestbook.models.db”?使用in-ns还是某种仅限于编辑器的东西吗? 在使用in-ns切换之前,您需要在REPL中(require 'guestbook.models.db)(或者使用编辑器的函数正确加载命名空间),否则您将切换到一个新创建的此名称命名空间而没有引入诸如clojure.core等基本脚手架,显然在这里发生了这种情况。 - Michał Marczyk
哦,你应该可以通过输入(clojure.core/require :reload 'guestbook.models.db)来解决这个问题。 - Michał Marczyk
2
你必须使用in-ns(或一些直接依赖它的编辑器功能)来切换到guestbook.models.db,而不是从源文件中加载它。in-ns创建完全裸露的命名空间,甚至不引用clojure.core中的符号(参见(doc refer)),并且根本不关心源文件。相反,您应该首先加载源文件(例如使用require)。一旦命名空间被加载,就可以使用in-ns来切换到它。 - Michał Marczyk
当我像这样加载命名空间时,我看到了类似的行为:(ns guestbook.repl): (start-server) 编译器异常 java.lang.RuntimeException: 无法解析符号: start-server 在此上下文中, 编译:(C:\Users\Simeon\AppData\Local\Temp\form-init6442755879023838607.clj:1:1)。它是否也与in-ns表现类似,需要一个requre命令?(use guestbook.repl)会有相同的效果吗?谢谢。 - Simeon Leyzerzon
@SimeonLeyzerzon (ns foo) 不会从磁盘加载 foo - 如果不存在,它将创建一个名为 foo 的新命名空间。因此,是的,您需要 requireuse 您的命名空间。 - Michał Marczyk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接