2012-01-21 40 views
3

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

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

; re-export Incanter somehow 

然后在REPL我将能够在仅仅use -ing mine.core使用咒术功能。

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

谢谢!

+0

看看http://stackoverflow.com/questions/4732134/can-i-refer-another-namespace-and-expose-its-functions-as-public-for-the-current?rq=1 – jwhitlark

回答

2

我曾经通过将常用REPLd在一个单独的文件,我可以load-file当我开始我REPL use表达式来做到这一点。这工作得很好,因为我可以把所有东西放在那里,然后获得不止一个命名空间。

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

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

0

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

但是,如果你确实需要这个,例如呈现了一致的接口,那么你就可以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] 

请注意,符号的原始名称空间中的更改将不会反映,直到您重新实习符号。