2014-12-11 89 views
3

我從命名空間learning.greeting如何從另一個命名空間卸載一個函數?

(use 'learning.greeting) 

裝載函數say-hi當我嘗試重新DEFN當前(用戶)的命名空間下,比如喜功能,我得到了錯誤:

CompilerException java.lang.IllegalStateException: say-hi already refers to: #'learning.greeting/say-hi in namespace: user, compiling:(NO_SOURCE_PATH:1:1) 

那麼如何從其他名稱空間卸載函數呢?

回答

4

如果你想從在REPL另一個命名空間擺脫直接映射到無功,說

(ns-unmap 'current-namespace 'local-alias) 

實施例:

user=> (ns-unmap *ns* 'reduce) 
nil 
user=> (reduce + 0 [1 2 3]) 
CompilerException java.lang.RuntimeException: Unable to resolve symbol: reduce in this context, compiling:(NO_SOURCE_PATH:2:1) 

本地別名將從無功的實際名稱不同,如果:rename WA Š使用:

(use '[clojure.walk 
     :only [keywordize-keys] 
     :rename {keywordize-keys keywordize}]) 

要刪除的瓦爾指向所有映射在clojure.walk

(doseq [[sym v] (ns-map *ns*)] 
    (if (and (var? v) 
      (= (.. v -ns -name) 'clojure.walk)) 
    (ns-unmap *ns* sym))) 
+0

謝謝。 'ns-unmap'處理得很好。 – Nick 2014-12-11 07:41:00

2

你真的想要從learning.greeting刪除say-hi嗎?否則,在這種情況下使用require可能會更好。取而代之的(use 'learning.greeting),執行:

(require `[learning.greeting :as lg]) 

那麼你可以參考的原始定義爲lg/say-hi,並且可以在當前的命名空間,例如定義一個新版本作爲

(def say-hi [x] (lg/say-hi (list x x)) 

(我不知道這是否是對這個say-hi功能,但總的一點是相同的,不管。)

+0

是的,它是「最好使用需要在這種情況下」。我從現在開始遵循這個建議。謝謝。 – Nick 2014-12-11 07:42:32

2

兩個userequire有:排除參數只是這種情況:

(use '[learning.greeting :exclude [say-hi]]) 

或更優選使用要求:

(require '[learning.greeting :refer :all :exclude [say-hi]]) 

或者當你在一個正常的命名空間中把所有這一切在ns形式的工作優先:

(ns my-namespace 
    (:require [learning.greeting :refer [ function1 function2] :as greeting] 
相關問題