什么是惯用的clojure:使用

时间:2011-04-27 04:40:38

标签: clojure idiomatic

我在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))

4 个答案:

答案 0 :(得分:8)

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

用于处理命名空间的API不必要地学习。然而,它肯定能够用于各种各样的用途,因此重写的压力尚未达到任何人的沸点。

答案 1 :(得分:4)

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

  

值得注意的是,我们应该提到的是   (:use(clojure set xml))语句被认为是混杂操作   因此气馁。 [...]组织你的时候   代码名称中的代码,最好只导出和导入那些代码   需要的元素。

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

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

答案 2 :(得分:2)

案例1,3和4无效并抛出一些异常。我没见过2 - 只与:only等结合使用。

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

我通常使用5。

答案 3 :(得分:0)

在Clojure 1.4+中,我根本不会使用userequire可以执行use现在可以执行的所有操作,因此请忘记use。少担心一件事。

如果您想要use - 就像行为(仍然是糟糕的形式,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?