【问题标题】:What's idiomatic clojure for :use什么是惯用的clojure:使用
【发布时间】:2011-08-13 13:19:02
【问题描述】:

我在 clojure 中看到了 :use 的几种不同方法——惯用/首选方法是什么?

#1

(ns namespace.core
  (:use [[something.core]
         [another.core]]))

或 #2 编辑:将此与 :only 结合使用。

(ns namespace.core
  (:use [something.core]
        [another.core]))

或#3

(ns namespace.core
  (:use [something.core
         another.core]))

或#4

(ns namespace.core
  (:use (something.core
         another.core)))

或#5 编辑:这是惯用的,但应该像#2 中那样使用:use

(ns namespace.core
  (:use something.core
        another.core))

【问题讨论】:

    标签: clojure idioms


    【解决方案1】:

    在 Clojure 1.4+ 中,我根本不会使用 userequire 可以做所有use 现在可以做的事情,所以忘记use。少一件需要担心的事情。

    如果你想要use-like 行为(仍然是糟糕的形式,imo)你可以这样做:

    (ns namespace.core
      (:require
        [something.core :refer :all]
        [another.core :refer :all]))
    

    如果您想要 :use .. :only 行为,请使用:

    (ns namespace.core
      (:require
        [something.core :refer [foo bar]]
        [another.core :refer [quux]]))
    

    更多详情:In Clojure 1.4 what is the use of refer within require?

    【讨论】:

      【解决方案2】:

      实际上它们都不是惯用的。你应该总是在你的:uses 中有一个:only 子句。您最好的选择是将 :only 添加到#2。如果您不想枚举从另一个命名空间获取的所有变量,请考虑 (:require [foo.bar :as bar])。

      我们应该提到的一点是 (:use (clojure set xml)) 语句被认为是混杂操作 因而气馁。 [...] 组织您的 代码沿命名空间,最好只导出和导入那些 需要的元素。

      -来自 Clojure 的喜悦,第 183 页。

      一个例外是测试命名空间应该只使用它测试的命名空间。

      【讨论】:

        【解决方案3】:

        选择 #5 是惯用的,除非您传递附加选项,例如 :only、:exclude 等。Colin's blog post 详细介绍了这些选项。

        处理命名空间的 API 非常难学。但是,它的用途肯定是足够的,因此重写的压力还没有达到任何人的沸点。

        【讨论】:

          【解决方案4】:

          情况 1、3 和 4 无效并抛出一些异常。我还没有看到 2 - 仅与 :only 或类似的组合。

          (ns namespace.core
            (:use
              [something.core :only (x)]
              another.core))
          

          我通常使用 5。

          【讨论】:

          • 糟糕,我正在查看我的 project.clj :dependencies 以获得 #1。