Clojure:重新导出vars



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

(ns mine.core
  (:use [incanter core charts datasets io]))
; re-export Incanter somehow

然后,在REPL中,我只需usemine.core就可以使用Incenter的函数。

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

谢谢!

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

后来,我转而定义一个"everything"命名空间,并在其中使用leininged :main指令启动我的repl,就像这个SO问题中一样,这就像我的第一种方法,但看起来更优雅。

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

尝试http://code.google.com/p/clj-nstools/

我建议考虑像其他答案中建议的那样显式导入所有必要的依赖项。这通常会导致代码不那么复杂。

然而,如果您确实希望这样做,例如,提供一个一致的接口,那么您可以使用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]

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

最新更新