Hi,
I made a quick hack that allows the Slime listener to use Lisp objects that were returned from the Common Lisp environment. We already can do this using *, **, and *** variables but, to me, is not enough. I have an hard time remembering the number of stars that I should write and, moreover, I prefer to 'point' to a value that is presented in the listener and I use it in the construction of next expression, just like in Symbolics Lisp machines. For those who never saw the Symbolics environment, let me give you a description of what I can do with this patch to Slime:
CL-USER> (cons 1 2) (1 . 2) ;;this is just like in good old Slime CL-USER> (cons (1 . 2) (1 . 2)) ;; something new: I wrote "(cons " ;;and then I moved the cursor to the previous line and pressed return. ;;The previous output is copied to the current prompt but, in fact, it's ;;not only text. It also represents the previous value returned by the ;;environment. In this example I did the same operation twice and then I wrote the closing ")". The result, as expected, is: ((1 . 2) 1 . 2) CL-USER> (eq (car ((1 . 2) 1 . 2)) (cdr ((1 . 2) 1 . 2))) ;;again, I wrote "(eq (car " and then I copied the previous output (using return). Then, I wrote ") (cdr " and I copied again the previous output. After finishing the form (with "))"), the environment returns: T ;;as expected.
You cannot see it in this email (I presume) but I also mark the reused values in a different color and I make then read-only (in Emacs) so that you can see that they are a different beast.
Another interesting extension is to directly inspect any returned value. I changed the inspect command so that, whenever the cursor is over a returned value, C-cC-I automatically inspects it.
There are lots of other things that we can do like discovering the types of the presented values and restrict their use for certain operations. For example, if there's a function that asks the user for a number, we can allow him to reuse old values as long as they are of type number. In short, this is just a quick hack to provide a stripped down version of presentation types that works with emacs. I guess that the edit-value feature of Slime could also be rewritten to take advantage of this stuff.
Now, it should be obvious that I am keeping all the returned values in the Common Lisp side for further use. This means that they are not GCed. So, from time to time, it might be wise to clean the Listener (just like before, with C-cC-t) or just the previous output (with C-cC-o). This also releases the corresponding objects from the Common Lisp side.
I suggest you try it out.
If the Slime team thinks this is useful then I suggest that you take a good look at the code (as you usually do :-) and refactor it radically because I did a lot of copy&paste just to test the idea. And it might also contains lots of bugs :-)
There are also lots of improvements that can be done like not storing the values that don't require identity preservation (like small numbers, and characters), like providing the functions that allow the type of a value to be returned (e.g., to provide a menu of operations for the object, etc), like allowing parts of lists to be reuse (this one seems easy but requires different conventions for the gestures needed for reusing previous values), etc, etc.
Best regards,
António Leitão.
Here's the patch: