3 (defgeneric release (object))
5 (defun release* (&rest objects)
6 (declare (dynamic-extent objects))
11 (defmacro using ((var expr) &body body)
17 (defun using-expand (bindings body)
19 (destructuring-bind (var expr) (first bindings)
22 ,(using-expand (rest bindings) body)
26 (defmacro using* ((&rest bindings) &body body)
27 (using-expand bindings body))
29 (defvar *registered-stable-pointers* (make-array 0 :adjustable t :fill-pointer t))
31 (defun allocate-stable-pointer (thing)
32 (let ((id (find-fresh-id)))
33 (setf (aref *registered-stable-pointers* id) thing)
36 (defun free-stable-pointer (stable-pointer)
37 (setf (aref *registered-stable-pointers* (pointer-address stable-pointer)) nil))
39 (defun get-stable-pointer-value (stable-pointer)
40 (aref *registered-stable-pointers* (pointer-address stable-pointer)))
42 (defun find-fresh-id ()
43 (or (position nil *registered-stable-pointers*)
44 (progn (vector-push-extend nil *registered-stable-pointers*)
45 (1- (length *registered-stable-pointers*)))))
47 (defmacro with-stable-pointer ((ptr expr) &body body)
48 `(let ((,ptr (allocate-stable-pointer ,expr)))
51 (free-stable-pointer ,ptr))))