如何重命名使用(ns(:require:refer))

时间:2013-01-30 18:19:15

标签: variables import clojure namespaces

我的理解是现在建议使用 require :refer宏中的use代替ns。例如,执行:

(ns example.core 
  (:require [clj-json.core :refer [parse-string]]))

而不是

(ns example.core 
  (:use [clj-json.core :only [parse-string]]))

处理:rename use支持的require的推荐方法是什么? 具体来说,假设我想ancestors clojure.data.zip并重命名与clojure.core冲突的descendantsrequire函数。

换句话说,我想知道

(:use [clojure.data.zip :rename {ancestors xml-ancestors, descendants xml-descendants}) 等价物
{{1}}

4 个答案:

答案 0 :(得分:13)

(ns foo
  (:require [clojure.data.zip :refer [ancestors descendants] :rename {ancestors xml-ancestors descendants xml-descendants}]))

答案 1 :(得分:12)

您只需一步:require,然后:refer :rename。{/ p>

(ns foo
  (:require clojure.data.zip)
  (:refer [clojure.data.zip :rename {ancestors xml-ancestors,
                                     descendants xml-descendants})

:use一直是:require + :refer的简写,现在:refer的{​​{1}}选项是最简单:require的简写{1}}。

答案 2 :(得分:4)

免责声明:我不知道“推荐”的方法。我只知道我会怎么做。我的解决方案可能不是惯用的Clojure,如果没有人能得到更好的答案,我会感到惊讶。


以下是我要做的事情::require使用:as打包并使用别名:

(ns some.big.name.space
  (:require [clojure.data.zip  :as  cdz])
  ... some more imports, maybe ...)

然后可以使用指定的前缀访问符号,并且不与我的some.big.name.space命名空间中的任何符号冲突:

(def some-list [cdz/ancestors cdz/descendants ancestors descendants])

如果别名很短,很难让我输入它,我觉得我的代码更清晰 - cdz/是一个很好的视觉提示,符号是导入的。

我知道这并没有真正回答您的确切问题 - 如何将:rename:require一起使用 - 但我觉得值得一提,因为它避免污染我的名称空间而且我不知道不得不搞乱Clojure的符号解析机制。

答案 3 :(得分:0)

如果您需要从Clojure核心重命名函数或宏,请使用:

(ns foo
  "Contains foo functionality."
  (:refer-clojure :rename {map core-map}))