2014-12-11 82 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] 
相关问题