Clojure:再出口变革

时间:2012-01-21 15:28:26

标签: namespaces clojure

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

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

; re-export Incanter somehow

然后在REPL中我只能use - mine.core使用Incanter的功能。

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

谢谢!

3 个答案:

答案 0 :(得分:2)

我曾经通过将常用的REPLd use表达式放在一个单独的文件中来完成此操作,当我启动REPL时,我可以load-file。这工作得相当好,因为我可以将所有内容放在那里,然后获得的不仅仅是一个命名空间。

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

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

答案 1 :(得分:1)

答案 2 :(得分:0)

我建议考虑明确导入所有必要的依赖项,如其他答案所示。这通常会导致代码不那么复杂。

但是如果你想要这个,例如要提供一致的界面,那么您可以使用clojure.core/intern函数执行此操作,该函数可以生成任何符号" native"给定命名空间。例如:

(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]

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