Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 使用在文件之间共享命名空间时出错(在ns中)_Clojure_Namespaces_Ring - Fatal编程技术网

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
的自动重新加载功能会变得混乱,然后会出现错误。所以,不要那样做!