【问题标题】:How to rename using (ns (:require :refer))如何使用 (ns (:require :refer)) 重命名
【发布时间】:2013-01-14 16:18:09
【问题描述】:

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

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

而不是

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

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

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

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

【问题讨论】:

    标签: variables import clojure namespaces


    【解决方案1】:
    (ns foo
      (:require [clojure.data.zip :refer [ancestors descendants] :rename {ancestors xml-ancestors descendants xml-descendants}]))
    

    【讨论】:

      【解决方案2】:

      你先是:require,然后是:refer,然后是:rename

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

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

      【讨论】:

      【解决方案3】:

      免责声明:我不知道执行此操作的“推荐”方式。我只知道我会怎么做。我的解决方案可能不是惯用的 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 的符号解析机制。

      【讨论】:

      • 感谢您的回复。你提出了一个很好的观点。我知道这种方法,只是好奇我想如何重命名
      • @apolenur 是的,抱歉我的回答没有帮助。
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-30
        相关资源
        最近更新 更多