什么是惯用的clojure:使用
Posted
技术标签:
【中文标题】什么是惯用的clojure:使用【英文标题】:What's idiomatic clojure for :use 【发布时间】: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))
【问题讨论】:
【参考方案1】:在 Clojure 1.4+ 中,我根本不会使用 use
。 require
可以做所有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。以上是关于什么是惯用的clojure:使用的主要内容,如果未能解决你的问题,请参考以下文章