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

apo*_*nur 13 variables import namespaces clojure

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

(ns example.core 
  (:require [clj-json.core :refer [parse-string]]))
Run Code Online (Sandbox Code Playgroud)

代替

(ns example.core 
  (:use [clj-json.core :only [parse-string]]))
Run Code Online (Sandbox Code Playgroud)

处理:rename哪些use支持的推荐方法是什么?具体来说,假设我想require clojure.data.zip和重命名ancestors以及descendants功能与clojure.core冲突.

换句话说,我想知道require等效的

(:use 
  [clojure.data.zip :rename {ancestors xml-ancestors, 
                             descendants xml-descendants})
Run Code Online (Sandbox Code Playgroud)

use*_*062 13

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


ama*_*loy 12

:require一步到位,然后:refer:rename在未来.

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

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


Mat*_*ick 4

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


这就是我要做的::require使用的包和别名:as

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

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

(def some-list [cdz/ancestors cdz/descendants ancestors descendants])
Run Code Online (Sandbox Code Playgroud)

如果别名很短,我输入它几乎不会打扰我,而且我觉得我的代码更清晰——这cdz/是一个很好的视觉提示,表明该符号是导入的。

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