什么是惯用的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+ 中,我根本不会使用 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。

以上是关于什么是惯用的clojure:使用的主要内容,如果未能解决你的问题,请参考以下文章

clojure 中的惯用配置管理?

“foo = bar || baz”的惯用 Clojure 是啥?

生成和管理后台线程的惯用 Clojure 方式

在 Clojure 中添加向量的惯用方法是啥?

通过 Clojure 中的集合进行递归的惯用方式

Clojure 中的惯用错误处理