3 (defgeneric release (object))
5 (defmethod release ((object null)))
7 (defun release* (&rest objects)
8 (declare (dynamic-extent objects))
13 (defmacro using ((var &optional (expr var)) &body body)
19 (defun using-expand (bindings body)
21 (destructuring-bind (var &optional (expr var)) (ensure-list (first bindings))
24 ,(using-expand (rest bindings) body)
28 (defmacro using* ((&rest bindings) &body body)
29 (using-expand bindings body))
31 (defvar *registered-stable-pointers* (make-array 0 :adjustable t :fill-pointer t))
33 (defun allocate-stable-pointer (thing)
34 (let ((id (find-fresh-id)))
35 (setf (aref *registered-stable-pointers* id) thing)
38 (defun free-stable-pointer (stable-pointer)
39 (setf (aref *registered-stable-pointers* (pointer-address stable-pointer)) nil))
41 (defun get-stable-pointer-value (stable-pointer)
42 (when (<= 0 (pointer-address stable-pointer) (length *registered-stable-pointers*))
43 (aref *registered-stable-pointers* (pointer-address stable-pointer))))
45 (defun find-fresh-id ()
46 (or (position nil *registered-stable-pointers*)
47 (progn (vector-push-extend nil *registered-stable-pointers*)
48 (1- (length *registered-stable-pointers*)))))
50 (defmacro with-stable-pointer ((ptr expr) &body body)
51 `(let ((,ptr (allocate-stable-pointer ,expr)))
54 (free-stable-pointer ,ptr))))