【问题标题】:Clojure automatically require filesClojure 自动需要文件
【发布时间】:2013-06-30 20:03:17
【问题描述】:

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

【问题讨论】:

  • 尝试过什么了吗?
  • 无非就是遍历目录并做(clojure.core/load "file")。
  • 你真的应该在这个问题上表现出一些努力,你确实尝试了一些东西,你到底在哪里卡住了。通常你会展示一些代码。 downvote 箭头表示:“这个问题没有显示任何研究工作;它不清楚或没有用”。如果你这样做,我相信你会得到答案。
  • 感谢您的反馈。我希望现在问题更清楚了。
  • @BrunoReis 实际上,现在关闭已重命名为“暂停”,您可以投票将问题暂停,“问题必须证明对正在解决的问题的最低理解。告诉我们什么您尝试过,为什么它不起作用,以及它应该如何工作。”

标签: clojure


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    Noir 像这样包含some functionality,使其成为在特定目录下加载命名空间的显式 API 调用。有关此示例,请参阅 load-views。它使用它来自动加载路径。

    但是,由于涉及大量魔法以及该方法带来的额外复杂性(例如,挥之不去的路径定义),Noir 方法并不符合习惯。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-14
      • 1970-01-01
      • 2017-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多