我的理解是现在建议使用
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冲突的descendants
和require
函数。
换句话说,我想知道
的(:use
[clojure.data.zip :rename {ancestors xml-ancestors,
descendants xml-descendants})
等价物
{{1}}
答案 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}))