[slime-devel] Slime/Allegro and make-weak-key-hash-table
Lynn Quam
quam at ai.sri.com
Wed Jul 12 15:26:05 UTC 2006
I experimented a bit with weak hashtables and SLIME in in both Allegro
and CMUCL. Here are a few things I found useful. They appear to work
with both Allegro and CMUCL.
(in-package :swank-backend)
#+allegro
(progn
;;; Crummy Allegro provides no way to ask if an object is a weak-vector.
(defstruct (weak-pointer (:constructor %make-weak-pointer))
pointer)
(defun make-weak-pointer (object)
"Creates a new weak pointer which points to OBJECT. For
portability reasons, OBJECT must not be NIL."
(assert (not (null object)))
(let ((wv (excl:weak-vector 1)))
(setf (svref wv 0) object)
(%make-weak-pointer :pointer wv)))
(defun weak-pointer-value (weak-pointer)
"If WEAK-POINTER is valid, returns its value. Otherwise, returns NIL."
(svref (weak-pointer-pointer weak-pointer) 0))
) ; end #+allegro progn
(definterface weak-value-gethash (ht key &optional default)
"Access hash-table with weak value."
(multiple-value-bind (val foundp) (gethash ht key)
(if foundp
(values (if (weak-pointer-p val)
(weak-pointer-value val)
val)
t)
default)))
(definterface (setf weak-value-gethash) (object ht key)
"Access hash-table with weak value."
(when object
(setf (gethash ht key) (make-weak-pointer object)))
object)
(in-package :swank)
(defun save-presented-object (object)
"Save OBJECT and return the assigned id.
If OBJECT was saved previously return the old id."
(or (gethash object *object-to-presentation-id*)
(let ((id (incf *presentation-counter*)))
(setf (swank-backend::weak-value-gethash id *presentation-id-to-object*) object)
(setf (gethash object *object-to-presentation-id*) id)
id)))
(defun lookup-presented-object (id)
"Retrieve the object corresponding to ID.
The secondary value indicates the absence of an entry."
(swank-backend::weak-value-gethash id *presentation-id-to-object*))
Helmut Eller replied:
> The reason is probably that nobody bothered to write the code.
> I added the necessary bits now.
>
> Helmut.
>
More information about the slime-devel
mailing list