views:

584

answers:

3

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?

+2  A: 

Yes, it is possible. Just make sure that you don't have a miss-matched clojure contrib jar in the same folder. I had clojure contrib from 1.1, and a clojure jar 1.2 snapshot.

Rob Lachlan
+2  A: 

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.

Rayne
A: 

emacs, swank, clojure and maven are still friends:

This blog post of mine describes the easiest way I've seen to get a swank server running on Linux. Basically you make a pom file and run maven, which deals with all versioning issues:

http://learnclojure.blogspot.com/2010/03/clojure-maven-emacs-eternal-golden.html

There was also a follow-up post showing how to add compojure.

And this describes using maven's version plugin to find out and use the latest versions of everything and add incanter:

http://learnclojure.blogspot.com/2010/08/returning-after-long-absence.html

Everything still works beautifully.

ELPA seems to be the best way to install slime in emacs these days.

John Lawrence Aspden