[editor-hints-devel] named-readtables/SLIME interaction problem

Cyrus Harmon ch-lisp at bobobeach.com
Thu Jan 27 21:41:30 UTC 2011


I ran into a problem with SLIME where I was getting errors the second time I would compile a buffer with contents such as the following:


(cl:eval-when (:compile-toplevel :load-toplevel :execute)
 (ql:quickload 'named-readtables))

(defpackage #:reader-macro-test
  (:use #:cl))

(in-package #:reader-macro-test)

(eval-when (:compile-toplevel :load-toplevel :execute)
  (named-readtables:defreadtable readtable-test
    (:merge :standard)))

(named-readtables:in-readtable readtable-test)


It turns out that the problem has to do with the way SLIME deals with the style-warning that the defreadtable gives about overwriting the existing readtable. The defreadtable form clears out the bindings for the existing reader, then issues the warning. SLIME parses the buffer and picks up that we're in the #:reader-macro-test package and sets *readtable* to be the readtable that we've just clobbered and then in SLIMEs error/warning handling code it further frobs (a copy of) the (now empty-ish) readtable and then attempts to read using that readtable and fails.

Tobias rightly points out that SLIME should have better support for named-readtables. It also seems to me that SLIME might want to make greater assurances about the state of the reader in its error handling code.

But the simple, expedient fix is:

--- named-readtables.lisp	2011-01-27 09:14:38.000000000 -0800
+++ /Users/sly/quicklisp/dists/quicklisp/software/named-readtables-20101006-darcs/named-readtables.lisp	2011-01-27 13:36:53.000000000 -0800
@@ -132,9 +132,9 @@
               (cond ((not readtable)
                      (setq readtable (make-readtable ',name)))
                     (t
-                     (setq readtable (%clear-readtable readtable))
                      (simple-style-warn "Overwriting already existing readtable ~S."
-                                        readtable)))
+                                        readtable)
+                     (setq readtable (%clear-readtable readtable))))
               ,@(loop for option in merge-clauses
                       collect (process-option option 'readtable))
               ,@(loop for option in case-clauses

Explicit SLIME support for named-readtables would be great, but, in the meantime, it would be nice to see this in the named-readtables source.

Thanks,

Cyrus







More information about the editor-hints-devel mailing list