On Thu, 17 Jun 2004 18:56:58 +1000, Alain.Picard@memetrics.com said:
ap> Luke Gorrie writes:
Alain.Picard@memetrics.com writes:
I have a file which defines a readtable so I can type things like #v(1 2). (Don't ask. :-)
When I hit M-. to find any definition in this file, emacs croaks and asks if I want to enter recursive edit. Saying yes yields a SLDB buffer like this:
The `with-standard-io-syntax' in dspec-stream-position looks suspicious to me (swank-lispworks.lisp). How about if you remove it?
ap> If you remove it, it works. In fact, I think there are TWO bugs ap> in that function; I think that *read-eval* needs to be set to T.
It was bound it to NIL to prevent unexpected evaluation -- it depends on how dangerous you want M-. to be :-)
#.(call-system "rm -rf /")
ap> I propose:
ap> (defun dspec-stream-position (stream dspec) ap> (let ((*read-eval* t)) ap> (loop (let* ((pos (file-position stream)) ap> (form (read stream nil '#1=#:eof))) ap> (when (eq form '#1#) ap> (return nil)) ap> (labels ((check-dspec (form) ap> (when (consp form) ap> (let ((operator (car form))) ap> (case operator ap> ((progn) ap> (mapcar #'check-dspec ap> (cdr form))) ap> ((eval-when locally macrolet symbol-macrolet) ap> (mapcar #'check-dspec ap> (cddr form))) ap> ((in-package) ap> (let ((package (find-package (second form)))) ap> (when package ap> (setq *package* package)))) ap> (otherwise ap> (let ((form-dspec (dspec:parse-form-dspec form))) ap> (when (dspec:dspec-equal dspec form-dspec) ap> (return pos))))))))) ap> (check-dspec form))))))
ap> in swank-lispworks.lisp.
I made it use WITH-STANDARD-IO-SYNTAX originally to get all the standard bindings, in particular you must also bind *PACKAGE* because the function sets it. There is also *READ-BASE*, *READ-DEFAULT-FLOAT-FORMAT* and *READ-SUPPRESS* to consider.
What binds *READTABLE* when you do M-. anyway? It doesn't seem to be bound for me when DSPEC-STREAM-POSITION is reached via FIND-DEFINITIONS-FOR-EMACS.
__Martin