关于clojure:如何从加载的文件中引用函数?

How do I refer to functions from a loaded file?

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

1
2
3
(defn run-migration [filename]
  (load filename)
  (run))

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

可能我会以错误的方式进行操作。有什么好的(惯用的)方法指导,可以使一组文件在运行时加载并运行?


在我的一个项目中,我使用以下代码(真实代码的片段)动态加载模块:

1
2
3
4
5
6
7
8
... 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是符号,代表名称空间。该符号是通过在类路径中搜索来动态构建的。这是我在类路径

中查找模块所用的代码示例


您可以告诉编译器函数run将在以后定义:

1
2
3
user> (declare run)
#'user/run
user> (load"filename")

将把您的文件加载到repl中。也许您可能想通过绑定ns来设置将文件加载到其中的名称空间,尽管这不一定是必须的。