3

我正在尝试在 clojure 中制作小型 Web 框架。我在 /handlers 目录中有一堆 clojure 文件,我想在我的项目的 .core 命名空间中要求所有这些文件。每个文件都定义了自己的命名空间。例如:project.handlers.home。这背后的想法是当我添加新的处理程序时,我不想修改我的核心文件中的命名空间声明以包含它。我想出的唯一解决方案是找到目录中的所有文件并使用 clojure.core/load 加载它们,但这远非美观和惯用的。有没有一种惯用的方法来做到这一点?

4

2 回答 2

7

有没有一种惯用的方法来做到这一点?

国际海事组织,没有。Clojure 中的惯用语通常倾向于显式而不是“做魔术”,尤其是在命名全局对象时(显然是自动加载命名空间)。

我不知道为什么你不想在添加新的处理程序时修改你的“核心”文件,但你可能会考虑引入一个额外的命名空间来加载“核心”和你的处理程序并将它们挂钩在一起。

于 2013-07-01T06:29:43.643 回答
1

Noir包含一些类似的功能,使其成为在特定目录下加载命名空间的显式 API 调用。有关此示例,请参见加载视图。它使用它来自动加载路径。

然而,由于涉及的魔法数量以及该方法的其他复杂性(例如,挥之不去的路径定义),Noir 方法并不符合习惯。

如果您需要从工具、框架或库的角度查找命名空间,我会使用find-namespacesintools.namespace然后 require/load 它们。这种方法在提供用户级别的可插入性方面可能很有用,用户可以将处理程序放入目录中,然后在代码中查看新选项,尽管再次显式往往会更清晰。

于 2013-07-01T23:10:08.580 回答