Getting started with Clojure/Emacs/Slime May 4th, 2010
Patrick Stein

I spent some considerable time yesterday poring over the shelves in the programmer’s section of a local bookstore yesterday. Based on the available jobs at the moment, I was trying to decide whether it would be less painful to learn C#/.NET/AFW/blurpz or Hibernate/Springs/Struts/glorpka. My lambda, those things are fugly. When I open a book to find that my simple database example takes eight XML configuration files and twenty-five lines of calls to the same function (with a 25-character identifier (which, technically, should be namespace qualified, too)), I just don’t want to go there.

So, I walked away with Programming Clojure and a determination to think really hard about how to get paid to do something that’s not intensely painful.

Well, yesterday afternoon and late-night were intensely painful trying to get Clojure/Emacs/Slime all working together. Today, magickly, I messed something up in my .emacs file that convinced swank-clojure to download its own copies of the three JAR files it needs and zoom… I’m out of the gate.

Someday, I’d still like to be able to use my own JAR files for all of this, but in the meantime, I’m up and running.

Here’s what works

This is the relevant configuration from my .emacs file. It draws partly from these instructions by I’m not sure who, partly from this message by Constantine Vetoshev, partly from how my .emacs file was previously arranged, partly from sources now lost in the browser history sea, and partly from sheer luck.

First, some generic stuff up at the beginning:

(defun add-subdirs-to-load-path (dir)
  (let ((default-directory (concat dir "/")))
    (normal-top-level-add-subdirs-to-load-path)))

(add-to-list 'load-path "~/.emacs.d/site-lisp")
(add-subdirs-to-load-path "~/.emacs.d/site-lisp")

Then, prepping slime a bit:

(require 'slime-autoloads)
(add-to-list 'load-path "~/.emacs.d/site-lisp/slime/contrib")

(add-hook 'lisp-mode-hook (lambda () (slime-mode t)))
(add-hook 'inferior-lisp-mode-hook (lambda () (inferior-slime-mode t)))
(setq common-lisp-hyperspec-root
      "file:///Developer/Documentation/Lisp/clhs/HyperSpec/")

(slime-setup '(slime-repl))

(setq slime-net-coding-system 'utf-8-unix)

Then, setting up some general stuff for easy lisp implementations. (The –sbcl-nolineedit is something I personally use in my .sbclrc to decide whether to load linedit.)

(setq slime-lisp-implementations
      '((sbcl ("sbcl" "--sbcl-nolineedit"))
        (ccl ("ccl"))
        (ccl64 ("ccl64"))))

Some commands to simplify things so I don’t have to remember to M–– M-x slime:

(defmacro defslime-start (name mapping)
  `(defun ,name ()
     (interactive)
     (let ((slime-default-lisp ,mapping))
       (slime))))

(defslime-start ccl 'ccl)
(defslime-start ccl64 'ccl64)
(defslime-start clojure 'clojure)
(defslime-start sbcl 'sbcl)

Then, Clojure-specific SLIME stuff

(autoload 'clojure-mode "clojure-mode" "A major mode for Clojure" t)
(add-to-list 'auto-mode-alist '("\\.clj$" . clojure-mode))
(require 'swank-clojure)

(setq slime-lisp-implementations
      (append slime-lisp-implementations
              `((clojure ,(swank-clojure-cmd) :init swank-clojure-init))))

And, a touch more slime stuff to make things a little happier.

(add-hook 'slime-mode-hook
          (lambda ()
            (setq slime-truncate-lines nil)
            (slime-redirect-inferior-output)))

In my .emacs.d/site-lisp, I did the following:

% rm -rf slime swank-clojure clojure-mode
% git clone git://git.boinkor.net/slime.git
% git clone http://github.com/technomancy/swank-clojure.git
% git clone http://github.com/jochu/clojure-mode.git

What didn’t work

Before accidentally triggering swank-clojure to download its own JARs, I tried installing what I could with ELPA. I tried installing clojure, clojure-contrib, and swank-clojure with Lein. I tried installing them with Maven. I tried various combinations of versions of clojure and swank-clojure.

I have no idea how the JARs that swank-clojure built itself got built. I cannot reproduce it.

Edit: Ah, it appears that the Subversion repository for Clojure that I found is deprecated. But, I don’t have the energy to try the git repository myself at this point. Maybe next week.

TC Lispers April Presentations online April 29th, 2010
Patrick Stein

The Twin Cities Lisp Users Group meeting for April was last Monday. The main topic was Web Frameworks, but there were also two shorter talks.

Weblocks Presentation

Patrick Stein gave this presentation at the TC Lispers meeting in April 2010.

Weblocks on Vimeo.

Allegro Serve and Web Actions Presentation

Robert Goldman gave this presentation at the TC Lispers meeting in April 2010.

Apology: Unfortunately, ScreenFlow bombed out on me when I went to stop recording. It subsequently saw that it had a partial project there but was unable to recover it. As such, there is no video available for this presentation. Feh. — Patrick

Hunchentoot Presentation

Paul Krueger gave this presentation at the TC Lispers meeting in April 2010.

Hunchentoot on Vimeo.

Cocoa Lisp Controller Presentation

Paul Krueger gave this presentation at the TC Lispers meeting in April 2010.

Cocoa Lisp Controller on Vimeo.

CL-Growl Presentation

Patrick Stein gave this presentation at the TC Lispers meeting in April 2010.

CL-Growl on Vimeo.

CL-Growl patched for CCL April 29th, 2010
Patrick Stein

Alexandre Paes submitted a patch for my CL-Growl library so it now works with CCL (aka. Clozure, formerly OpenMCL), too.

Here is the source tarball: cl-growl_1.1.2010.04.29.tar.gz and the corresponding GPG signature: cl-growl_1.1.2010.04.29.tar.gz.asc. For other ways to access this code, see the CL-Growl page.

Thank you, Alex!

Weblocks Slides April 26th, 2010
Patrick Stein

At the TC Lispers meeting tonight, I will be giving a little presentation about weblocks. Here are slides for that presentation.

ps. if you’re in range, come to the meeting… Common Roots Cafe in Minneapolis.

CL-Growl Slides April 23rd, 2010
Patrick Stein

On Monday, I am giving a lightning talk at the TC Lispers meeting about my Common Lisp Growl client library.

Here are the slides with presenter notes and the accompanying sample code.

Updates In Email

Email:

l