无法加载和编译外部clojure文件

无法加载和编译外部clojure文件,clojure,compilation,load,libraries,Clojure,Compilation,Load,Libraries,我正试图从另一个.clj文件中加载和/或编译一个.clj文件。 我这样做是因为我试图加载的文件只包含一组映射,我打算最终用xml文件替换这些映射。我可以只:使用文件,它就会工作,但我正在尝试加载一组外部数据 通过对repl的一些随机攻击(通过emacs等),我能够(加载“default_libs”)以及(编译…它(使用不同的名称空间限定符组合,”,以及“)并获得对映射的访问权限,但在重新启动repl后,它不再工作,而且无论如何,我必须使用完整的名称空间名称来获取数据 这是lib_manager.

我正试图从另一个.clj文件中加载和/或编译一个.clj文件。 我这样做是因为我试图加载的文件只包含一组映射,我打算最终用xml文件替换这些映射。我可以只
:使用
文件,它就会工作,但我正在尝试加载一组外部数据

通过对repl的一些随机攻击(通过emacs等),我能够
(加载“default_libs”)
以及
(编译…
它(使用不同的名称空间限定符组合,
,以及
)并获得对映射的访问权限,但在重新启动repl后,它不再工作,而且无论如何,我必须使用完整的名称空间名称来获取数据

这是lib_manager.clj:

(ns mycad.lib-manager
  (:use [clojure repl]
        [mycad utils]))

(compile 'mycad.default-libs)
(println mycad.default-libs/default-symbols) 
这是我试图加载的文件,
default_libs.clj
。这里的数据最终将是一些xml文件,但我在这方面还是很新的,所以现在我只直接编写了一系列clojure映射

(ns mycad.default-libs)
(def default-symbols {.... })
因此,问题是如何从
.clj
文件中加载一组数据,而不使用
(ns…
将其真正加载到命名空间中,而是使用
加载
编译
将其视为数据源


感谢您的帮助

将示例中的
编译
更改为
加载
,如您前面在问题中所述。这样示例就可以运行了

compile
用于名称空间的AOT编译。因此,这里不需要它

如果只定义了一个映射,您可以使用
加载文件

(def default-symbols (load-file "/file/path.clj"))
如果“文件”实际上位于类路径上的某个地方或某个其他非本地流,则会出现
加载字符串

(def default-symbols (load-string (slurp (io/reader stream))))

Lisp是非常动态的语言。Clojure作为Lisp,允许您执行以下操作:

user=> (eval (read-string "(def a 10)"))
#'user/a
user=> a
10
因此,您可以加载您的文件,例如,使用函数
read all
,然后
(eval
all forms:

(use 'clojure.java.io) ; for (reader ..) function
(import 'java.io.PushbackReader)
....
(doseq [f (read-all (PushbackReader. (reader "your/file.clj")))] (eval f))
然后,如果
文件.clj
包含
(仅def
初始化,它们将位于当前命名空间中,则可以将它们用作简单变量。但是,如果
文件.clj
包含一些命名空间更改形式(
(ns..)
(ns..)
),则事情可能会变得复杂,因为当前名称空间将更改。如果此类声明是强制性的,并且无法在文件本身中删除,则可以尝试筛选它们,
(eval
,仅当表单是定义时才对其进行评估

更新:嗯,我发现
(eval
+
(read all
)在某种意义上等同于
(load file
):

(load-file "your/file.clj")
但是在
load file
的情况下,即使有更改名称空间的命令,名称空间也不会更改-这些名称空间只是加载到内存中,您可以像往常一样引用其中的符号。这似乎是您需要的