Clojure - 相同的函数名称不同的命名空间

时间:2016-02-04 09:36:39

标签: clojure namespaces read-eval-print-loop

我正在尝试执行以下操作:

(ns ns-test.core
  (:use [ns-test.a :as a]
    [ns-test.b :as b]))

(def test-map {:key "a"})

(defmulti print-ns :key)
(defmethod print-ns "a" [input-map]
  (a/foo input-map))
(defmethod print-ns "b" [input-map]
  (b/foo input-map))

命名空间a和b如下所示:

(ns ns-test.a)

(defn foo [x]
  (println x "I'm in namespace A."))

(ns ns-test.b)

(defn foo [x]
  (println x "I'm in namespace B."))

但是当我尝试将这些类加载到REPL中时,我得到了这个:

user=> (use 'ns-test.core :reload)

CompilerException java.lang.IllegalStateException: foo already refers to: #'ns-test.a/foo in namespace: ns-test.core, compiling:(ns_test/core.clj:1:1) 

为什么存在/ foo和b / foo之间的冲突,我该如何防止它? (是不是命名空间和命名空间限定的全部要点允许我有两个不同的同名函数?)

1 个答案:

答案 0 :(得分:4)

您可能希望:require命名空间ab而不是:use:use将名称空间符号实例化为当前名称空间,从而产生冲突。