无法加载和编译外部clojure文件
我正试图从另一个.clj文件中加载和/或编译一个.clj文件。 我这样做是因为我试图加载的文件只包含一组映射,我打算最终用xml文件替换这些映射。我可以只无法加载和编译外部clojure文件,clojure,compilation,load,libraries,Clojure,Compilation,Load,Libraries,我正试图从另一个.clj文件中加载和/或编译一个.clj文件。 我这样做是因为我试图加载的文件只包含一组映射,我打算最终用xml文件替换这些映射。我可以只:使用文件,它就会工作,但我正在尝试加载一组外部数据 通过对repl的一些随机攻击(通过emacs等),我能够(加载“default_libs”)以及(编译…它(使用不同的名称空间限定符组合,”,以及“)并获得对映射的访问权限,但在重新启动repl后,它不再工作,而且无论如何,我必须使用完整的名称空间名称来获取数据 这是lib_manager.
:使用文件,它就会工作,但我正在尝试加载一组外部数据
通过对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
的情况下,即使有更改名称空间的命令,名称空间也不会更改-这些名称空间只是加载到内存中,您可以像往常一样引用其中的符号。这似乎是您需要的