2013-06-30 34 views
2

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

+0

尝试过了吗? –

+0

无非是遍历目录和做(clojure.core /加载“文件”)。 – ivs

+0

你应该真的在这个问题上表现出一些努力,你确实尝试了一些东西,以及你在哪里被困住。通常你会显示一些代码。 * downvote *箭头说:“这个问题没有显示任何研究工作;它不清楚或没有用”。如果你这样做,我相信你会得到答案。 –

回答

7

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

IMO,no。 Clojure中的习惯用语通常赞成明确表达“做魔术”,特别是在命名全局对象时(自动加载名称空间显然是这样)。

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

+0

谢谢你的回答。 – ivs

1

Noir包括some functionality像这样,使它成为一个明确的API调用来加载特定目录下的命名空间。有关此示例,请参阅load-views。它用它来自动加载路径。但是,Noir方法由于所涉及的魔法数量以及该方法的其他复杂性(例如滞留路径定义)而没有感觉到习惯用法。

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

+0

好点。谢谢。 – ivs