我有一个从另一个文件加载表达式的函数,但我不知道文件名是什么,它存储在一个变量中:
(defn run-migration [filename]
(load filename)
(run))
我知道所有这些文件都有一个名为“run”的常用方法。所以我尝试在加载该函数后调用它,但是当我在文件加载之前尝试在repl中要求此文件时,我得到“无法解析符号:运行”错误。显然clojure正在尝试编译文件,并且“run”当时没有绑定,因为加载发生在函数内部?
可能我会以错误的方式解决这个问题。有关良好(惯用)方法的任何指导,以获得一组在运行时加载和运行的文件吗?
答案 0 :(得分:3)
在我的一个项目中,我使用以下代码(实际代码片段)动态加载模块:
... loop over found namespaces with following body....
(require (vector n :reload true))
(let [load-fun (ns-resolve n (symbol "load-rules"))]
(when load-fun
(try
(load-fun)
(catch Exception ex
(error (str "Error during executing of func from namespace '" n "': " ex))))))
此处n
是符号,表示命名空间。这个符号是通过在classpath的类路径... Here is example中搜索动态构造的,我用它来查找类路径中的模块
答案 1 :(得分:2)
您可以告诉编译器函数run
稍后会定义:
user> (declare run)
#'user/run
user> (load "filename")
将您的文件加载到repl中。也许您可能希望通过绑定 ns 来设置加载文件的命名空间,尽管这可能不一定。