【问题标题】:Clojure: re-export varsClojure:重新导出变量
【发布时间】:2012-01-21 15:28:26
【问题描述】:

有没有办法从另一个命名空间重新导出一些命名空间的变量?我希望能够做到这一点:

(ns mine.core
  (:use [incanter core charts datasets io]))

; re-export Incanter somehow

然后在 REPL 中,我可以通过 use-ing mine.core 使用 Incanter 的功能。

user=> (use 'mine.core)
nil
user=> (view (histogram (sample-normal 1000)))

谢谢!

【问题讨论】:

标签: namespaces clojure


【解决方案1】:

我过去常常通过将常用的 REPLd use 表达式放在一个单独的文件中来实现这一点,当我启动我的 REPL 时我可以 load-file 。这工作得相当好,因为我可以把所有东西都放在那里,然后得到不止一个命名空间。

后来我切换到定义一个“一切”命名空间,并使用 leiningend :main 指令 like in this SO question 开始我的 repl,这就像我的第一种方法,但看起来更优雅。

我的方式不断改变,我现在总是切换到包含代码的命名空间。这很有效,因为在较大的项目中它有助于跟踪哪些代码在哪里,我认为这种做法可以帮助我更快地学习代码的布局。当然每个人的经历都是不同的和个人的,YMMV :)

【讨论】:

    【解决方案2】:
    【解决方案3】:

    我建议考虑按照其他答案中的建议明确导入所有必要的依赖项。这通常会导致代码不太复杂。

    但是,如果您确实想要这个,例如要呈现一致的界面,那么您可以使用 clojure.core/intern 函数执行此操作,该函数使任何符号“原生”到给定的命名空间。例如:

    (ns user)
    (intern 'user 'map clojure.core/map)    
    (ns new-ns)
    (require 'user)
    (user/map inc [1 2 3])
    ; => [2 3 4]    
    (use 'user)
    ; =>  WARNING: map already refers to: #'clojure.core/map in namespace: new-ns, 
    ;     being replaced by: #'user/map
    (map inc [1 2 3]) 
    ; => [2 3 4]
    

    请注意,在重新实习符号之前,不会反映符号原始命名空间的更改。

    【讨论】:

      猜你喜欢
      • 2014-12-25
      • 1970-01-01
      • 2016-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-21
      • 1970-01-01
      相关资源
      最近更新 更多