我正在尝试使用Clojure编写用于执行dns查找的命名空间,并且我遇到了一个奇怪的问题。以下代码按预期编译和工作。
(ns dmarced.dns)
(defmulti lookup-record
(fn [type name]
type))
(defmethod lookup-record :txt [_ name]
[["foo"]])
另一方面,如果我想这样命名方法lookup
:
(ns dmarced.dns)
(defmulti lookup
(fn [type name]
type))
(defmethod lookup :txt [_ name]
[["foo"]])
它不会编译。我得到的错误是
Exception in thread "main" java.lang.IllegalArgumentException: No matching method: addMethod, compiling:(dmarced/dns.clj:7:1)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6875)
at clojure.lang.Compiler.analyze(Compiler.java:6669)
at clojure.lang.Compiler.analyze(Compiler.java:6625)
at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:6001)
at clojure.lang.Compiler$FnMethod.parse(Compiler.java:5380)
at clojure.lang.Compiler$FnExpr.parse(Compiler.java:3972)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6866)
at clojure.lang.Compiler.analyze(Compiler.java:6669)
at clojure.lang.Compiler.eval(Compiler.java:6924)
at clojure.lang.Compiler.load(Compiler.java:7379)
at clojure.lang.RT.loadResourceScript(RT.java:372)
at clojure.lang.RT.loadResourceScript(RT.java:363)
at clojure.lang.RT.load(RT.java:453)
at clojure.lang.RT.load(RT.java:419)
at clojure.core$load$fn__5677.invoke(core.clj:5893)
at clojure.core$load.invokeStatic(core.clj:5892)
at clojure.core$load.doInvoke(core.clj:5876)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at user$eval5$fn__16.invoke(form-init1251542249642636935.clj:1)
at user$eval5.invokeStatic(form-init1251542249642636935.clj:1)
at user$eval5.invoke(form-init1251542249642636935.clj:1)
at clojure.lang.Compiler.eval(Compiler.java:6927)
at clojure.lang.Compiler.eval(Compiler.java:6917)
at clojure.lang.Compiler.load(Compiler.java:7379)
at clojure.lang.Compiler.loadFile(Compiler.java:7317)
at clojure.main$load_script.invokeStatic(main.clj:275)
at clojure.main$init_opt.invokeStatic(main.clj:277)
at clojure.main$init_opt.invoke(main.clj:277)
at clojure.main$initialize.invokeStatic(main.clj:308)
at clojure.main$null_opt.invokeStatic(main.clj:342)
at clojure.main$null_opt.invoke(main.clj:339)
at clojure.main$main.invokeStatic(main.clj:421)
at clojure.main$main.doInvoke(main.clj:384)
at clojure.lang.RestFn.invoke(RestFn.java:421)
at clojure.lang.Var.invoke(Var.java:383)
at clojure.lang.AFn.applyToHelper(AFn.java:156)
at clojure.lang.Var.applyTo(Var.java:700)
at clojure.main.main(main.java:37)
Caused by: java.lang.IllegalArgumentException: No matching method: addMethod
at clojure.lang.Compiler$StaticMethodExpr.<init>(Compiler.java:1642)
at clojure.lang.Compiler$HostExpr$Parser.parse(Compiler.java:1011)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6868)
... 37 more
Failed.
感觉这应该是简单的事情,但我没有看到它。我已经检查过,lookup
似乎没有在其他地方定义。
使用Clojure 1.8.0
编辑:noisesmith指出它在香草Clojure项目中运作良好。一些实验告诉我,如果我删除对[dnsjava/dnsjava "2.1.7"]
的依赖性,问题就会消失,但我仍然不明白它为什么会在第一时间发生。