2011-10-21 30 views
0

嗨,大家好:我想看看我的命名空間中的所有函數,來自repl(用於快速黑客入侵和測試)。如何模仿使用中的「加載文件」行爲?

使用方法與負載有什麼不同?

我注意到,如果我「加載文件」x,所有導入現在在我的名字空間(即使是在文件外部)。但是,如果我「使用」x(通過引用x的命名空間),那些在x中導入的類是而不是可以在repl處獲得。

有沒有一種方法可以用來模擬加載文件將文件導入到我的repl中的方式?

回答

1

use這樣的特殊形式非常特別。你不能在調用者ns中寫入'使用'命名空間的函數。但一個簡單的宏可以拯救你!

我在一個項目這樣做回來之前,我不得不leiningen加載我REPL正確

(defmacro load-all [] 
    '(use 
    :reload-all 
    'com.cryptovide.modmath 
    'com.cryptovide.combine 
    'com.cryptovide.split 
    'com.cryptovide.encrypt 
    'com.cryptovide.misc 
    'com.cryptovide.decrypt 
    'com.cryptovide.modmathTest 
    'com.cryptovide.combineTest 
    'com.cryptovide.splitTest 
    'com.cryptovide.encryptTest 
    'com.cryptovide.miscTest 
    'com.cryptovide.decryptTest 
    'com.cryptovide.testlib 
    'com.cryptovide.gui 
    'com.cryptovide.checksum 
    'com.cryptovide.log)) 

當調用此,讀者運行從你所說的(例如命名空間中的use ES IT將use轉換成repl的當前ns

+0

不正確。 'use'是一個簡單的舊函數,它實現在諸如'require'和(我認爲)'intern'之類的基元之上。 – amalloy

1

使用將所有公共變量導入當前名稱空間。那不是你想要的嗎?

例子:

user> (use 'clojure.pprint) 
nil 
user> (pprint [:foo]) 
[:foo] 
nil 
+0

你是對的,我澄清了這個問題,我的意思是說,我希望我的x.clj文件的導入被加載到我的repl中,我有一個「x」。 clj「文件,它導入了很多類,我希望這些類方法可以在唱歌后從repl中調用le call(使用'x')。 – jayunit100

1

嘛,不這樣做:P。如果你想進入一個特定的命名空間,那麼爲什麼不直接進入這個命名空間呢,而不是冒充某種瘋狂的use來將所有東西導入user ns? (require 'myns) (in-ns 'myns)這樣做,還是一個方便的快捷方式(doto 'myns require in-ns)

+0

嗯沒關係。看起來像這樣刪除了標準的repl導入。有沒有辦法保留這些?例如,(源)宏將不再工作.... – jayunit100