2012-01-21 66 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] 

請注意,符號的原始名稱空間中的更改將不會反映,直到您重新實習符號。