I’m happily using swank-clojure, installed via elpa. But I’d like to do some work with deftype, defprotocol, etc., which aren’t aren’t available in clojure 1.1.
To use my own class paths, I’m using the excellent suggestion by Rick Moynihan in the stackoverflow question about setting custom classpaths, which was to set up a script like:
#!/bin/bash
java -server -cp "./lib/*":./src clojure.main -e "(do (require 'swank.swank) (swank.swank/start-repl))"
And that works swimmingly if the clojure jar file in lib is 1.1, but with 1.2, it blows up:
Exception in thread "main" java.lang.NoSuchMethodError: clojure.lang.RestFn.<init>(I)V (macroexpand.clj:1)
at clojure.lang.Compiler.eval(Compiler.java:5274)
at clojure.lang.Compiler.load(Compiler.java:5663)
at clojure.lang.RT.loadResourceScript(RT.java:330)
at clojure.lang.RT.loadResourceScript(RT.java:321)
at clojure.lang.RT.load(RT.java:399)
at clojure.lang.RT.load(RT.java:371)
at clojure.core$load__5663$fn__5671.invoke(core.clj:4255)
at clojure.core$load__5663.doInvoke(core.clj:4254)
at clojure.lang.RestFn.invoke(RestFn.java:409)
...and many, many more
So is there some magical incantation to make this work, or is clojure 1.2 compatibility not there yet?
The problem here is as stated above. Apparently, you’re running a Clojure that is out of sync with clojure-contrib. You need to build/use a build of Clojure that is built against the clojure-contrib jar you’re using, otherwise you’ll continue to see this error. At least, that’s the only thing I know that will cause this particular error.
I nearly shot myself trying to figure this one out a while back. Let’s hope this saved you the trouble.