Skip to content
2010/05/05 / highmt

clojure-1.2.0-SNAPSHOTとswankの名前の競合を回避する

java.lang.Exception: Name conflict, can't def group-by because namespace: swank.util refers to:#'clojure.core/group-by

という感じのエラーが出た場合、swank.utilでdefnされているgroup-byとclojure.coreに追加されたgroup-byがバッティングしている。

nsは、:refer-clojureを指定しなかった場合、デフォルトで(refer ‘clojure.core)する。
swank.utilはclojure.coreをnsによりreferした上で(defn group-by)しているのでバッティングする。
ので、util.cljは以下のようにして回避:

(ns swank.util
  (:refer-clojure :exclude [group-by]) ;; add this
  (:import (java.io StringReader)
           (clojure.lang LineNumberingPushbackReader)))

このswank.utilをclojure.coreと同時にreferしているところは、同様にswank.utilのgroup-byとclojure.coreのgroup-byがバッティングする。
ので、swank.utilかclojure.coreのどちらかのgroup-byをreferしないようにすればよい。
swankの中ではおそらくはswank.utilのほうのgroup-byが欲しいはずなので、clojure.coreからgroup-byの参照を除外。
たとえばio.cljは以下のようにして回避:

(ns swank.util.io
  (:refer-clojure :exclude [group-by]) ;; add this
  (:use [swank util]
        [swank.util.concurrent thread])
  (:import [java.io StringWriter Reader]))

他のものも同様に修正する。面倒なら、エラーが出る度にエラーの出たnsを修正していけばよい。

なお、一度referしたものはns-unmapで名前空間から削除できるらしい。

広告
%d人のブロガーが「いいね」をつけました。