如何从加载的文件中引用函数?

时间:2011-07-18 22:00:50

标签: clojure load

我有一个从另一个文件加载表达式的函数,但我不知道文件名是什么,它存储在一个变量中:

(defn run-migration [filename]
  (load filename)
  (run))

我知道所有这些文件都有一个名为“run”的常用方法。所以我尝试在加载该函数后调用它,但是当我在文件加载之前尝试在repl中要求此文件时,我得到“无法解析符号:运行”错误。显然clojure正在尝试编译文件,并且“run”当时没有绑定,因为加载发生在函数内部?

可能我会以错误的方式解决这个问题。有关良好(惯用)方法的任何指导,以获得一组在运行时加载和运行的文件吗?

2 个答案:

答案 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 来设置加载文件的命名空间,尽管这可能不一定。