我正在尝试在clojure中创建一个小的Web框架。我在/ handlers目录中有一堆clojure文件,我想在我的项目的.core命名空间中要求所有这些文件。每个文件都定义自己的命名空间例如:project.handlers.home。这背后的想法是当我添加新的处理程序时,我不想修改我的核心文件中的名称空间声明以包含它。我提出的唯一解决方案是找到目录中的所有文件并使用clojure.core / load加载它们,但它远非美观和惯用。有没有惯用的方法呢?
答案 0 :(得分:7)
有没有惯用的方法呢?
IMO,没有。 Clojure中的习语通常倾向于明确“做魔术”,尤其是在命名全局对象(明确地自动加载命名空间)时。
我不知道为什么在添加新处理程序时你不想修改你的“核心”文件,但你可能会考虑引入一个额外的命名空间来加载“核心”和你的处理程序并将它们挂钩在一起。
答案 1 :(得分:1)
some functionality,使其成为在特定目录下加载名称空间的显式API调用。有关此示例,请参阅load-views。它用它来自动加载路径。
然而,由于涉及的魔法数量以及该方法的其他复杂情况(例如延迟的路径定义),Noir方法并不具有惯用性。
如果您需要从工具,框架或库的角度查找命名空间,我会使用find-namespaces
in tools.namespace
然后需要/加载它们。这种方法在提供用户级可插拔性方面可能很有用,用户可以将处理程序放入目录中,然后在代码中查看新选项,但再次明确的往往会更加清晰。