14

我的理解是现在建议使用 require :refer,而不是usens宏中。例如,执行:

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

代替

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

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

换句话说,我想知道require等价于

(:use 
  [clojure.data.zip :rename {ancestors xml-ancestors, 
                             descendants xml-descendants})
4

4 回答 4

16
(ns foo
  (:require [clojure.data.zip :refer [ancestors descendants] :rename {ancestors xml-ancestors descendants xml-descendants}]))
于 2014-11-25T08:58:24.477 回答
12

:require在一步,然后:refer:rename下一步。

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

:use一直是:require+的简写:refer,现在:refer选项 to:require是最简单的 的简写refer

于 2013-01-30T21:44:45.690 回答
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/是一个很好的视觉提示,符号是一个导入。

我知道这并不能真正回答您的确切问题——如何使用:renamewith——:require但我觉得值得一提,因为它避免了污染我的命名空间,而且我不必弄乱 Clojure 的符号解析机制。

于 2013-01-30T19:08:27.617 回答
0

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

(ns foo
  "Contains foo functionality."
  (:refer-clojure :rename {map core-map}))
于 2014-07-17T22:43:36.590 回答