Hi Slime-hackers,
I'd like to suggest keeping a stack-like history for several macroexpansions in a row such that you can easily go back one macroexpansion after you've macroexpanded a form /inside/ the macroexpansion buffer. Erm, yeah, sure, here's a small example:
Let's say you have two macros like these:
(defmacro with-foo (() &body body) `(flet ((foo (arg) arg)) ,@body))
(defmacro with-bar ((arg) &body body) `(with-foo () (prog1 (foo ,arg) ,@body)))
Ah, well, hopefully yours will do something less stupid. Anyway, let's further say that you want to macroexpand (`C-c RET') the following form:
(with-bar ('foobar) (let ((x 1)) (* x x)))
the macroexpansion buffer should pop up containing something like
(WITH-FOO NIL (PROG1 (FOO 'FOOBAR) (LET ((X 1)) (* X X))))
Now you want to expand that form as well, so you place point before `(WITH-FOO' and press `C-c RET' again, now the old expansion buffer disappears and instead a new one pops up in some other window. While it's cool that macroexpansion works from within the macroexpansion buffer, the current behaviour is unfortunately somewhat annoying, because upon exit from the expansion buffer (via pressing `q'), -- while the old buffer constellation is nicely recovered as of before any macroexpansion --, the point won't afterwards be in the same window where you started macroexpansion.
(Split your emacs horizentally, on top the REPL, on the bottom the slime-scratch buffer; now paste the above form in the REPL and do a macroexpansion there, slime-scratch will be replaced by the expansion buffer; now expand again from inside the macroexpansion buffer, a new expansion buffer will be placed into the REPL window; there press `q' and the point will be within slime-scratch although you started from the REPL.)
I suggest a slightly different behaviour when expanding a form from within the macroexpansion buffer: the old buffer should be reused and you should be able to go back to the previous macroexpansion (like what `l' does in the inspector.)
Additionally I'd like to suggest a way to macroexpand into a newly created macroexpansion buffer that's independant from a possibly other expansion buffer that got created prior. The purpose is simply for side-by-side comparasions of the same macro but that was modified in between.
Finally, I'm often hit by not releasing the control-key fast enough such that a `C-c C-RET' key sequence is generated. Maybe that could be made an alias for `C-c RET'?
Keep up the great work!
-*- tcr