Clojure 使用在文件之间共享命名空间时出错(在ns中)
我在我的所有环形路由中共享一个名称空间,以便将每个路由保存在自己的文件中,因此我有一个文件Clojure 使用在文件之间共享命名空间时出错(在ns中),clojure,namespaces,ring,Clojure,Namespaces,Ring,我在我的所有环形路由中共享一个名称空间,以便将每个路由保存在自己的文件中,因此我有一个文件routes/core.clj,其中包含: (ns test-proxy.routes.core) ;; Some utility functions 然后我启动每个路由处理程序文件,如下所示: (in-ns 'test-proxy.routes.core) ;; rest of the code 当我启动服务器时,它工作正常 但是,当我更改任何文件并在浏览器中重新加载页面时,会出现以下错误: Caus
routes/core.clj
,其中包含:
(ns test-proxy.routes.core)
;; Some utility functions
然后我启动每个路由处理程序文件,如下所示:
(in-ns 'test-proxy.routes.core)
;; rest of the code
当我启动服务器时,它工作正常
但是,当我更改任何文件并在浏览器中重新加载页面时,会出现以下错误:
Caused by: java.lang.Exception: Found lib name 'test-proxy.routes.core'
containing period with prefix 'quote'. lib names inside prefix lists
must not contain periods
如果我手动重新启动服务器(lein-ring-server
),所有操作都会再次按预期进行,但只要我对代码库进行另一次更改,它就会失败,并出现相同的错误。它看起来确实与我使用名称空间的方式有关,但让我感到惊讶的是,当我重新启动服务器时,它可以正常工作
如果我将命名空间解压缩到(在ns test proxy.routes.core中)
(如错误所示),服务器甚至不会启动:
Syntax error (ClassNotFoundException) compiling at (diplomat/routes/docs.clj:1:1).
test-proxy.routes.core
ns中的
仅用于REPL
可以按任何方式划分函数。当您从任何其他名称空间引用函数时,只需使用完全限定名,如some.ns.of.mine/my fn
当然,您始终可以使用命名空间别名,如:
(ns some.other.ns.of.mine
(:require [some.ns.of.mine :as snom])) ; define namespace alias
....
(snom/my-fn ...) ; invoke the fn
请务必看到我在这里对你的论文提出质疑:在ns中
正是被一些库用于此目的,将名称空间拆分为多个文件。当然,最值得注意的是clojure.core本身,但我们知道这并不是用户代码遵循的好例子。我同意按照问题的意图去做是个坏主意,但我不想说ns
不适合它,因为这是它的第一次使用!谢谢你的链接,@alan thompson我会读的。但是,即使它不是惯用的,它在程序执行时也能很好地工作。(我相信)当lein-ring
导致自动重新加载时,它会抛出该错误…我不明白为什么。当您在ns
中使用时,您实际上是在撒谎文件中的名称空间是什么。因此,lein-ring
的自动重新加载功能会变得混乱,然后会出现错误。所以,不要那样做!