+;; defines a slot-unbound method for class and slot-name, fills
+;; the slot by calling reader function with the slot values of
+;; the instance's reader-keys
+(defmacro def-lazy-reader (class slot-name reader &rest reader-keys)
+ (let* ((the-slot-name (gensym))
+ (the-class (gensym))
+ (the-instance (gensym))
+ (keys '()))
+ (dolist (key reader-keys)
+ (push (list 'slot-value the-instance (list 'quote key)) keys))
+ (setq keys (nreverse keys))
+ `(defmethod slot-unbound (,the-class (,the-instance ,class)
+ (,the-slot-name (eql ',slot-name)))
+ (declare (ignore ,the-class))
+ (setf (slot-value ,the-instance ,the-slot-name)
+ (,reader ,@keys)))))
+
+
+(defparameter *queued-definitions-pathname*
+ (make-pathname :directory '(:absolute "tmp")
+ :name (format nil "hyperobject-def-~d" (get-universal-time))
+ :type "lisp"))
+(defparameter *queued-definitions-stream* nil)
+
+(defun add-definition (def)
+ (unless *queued-definitions-stream*
+ (setq *queued-definitions-stream* (open *queued-definitions-pathname*
+ :direction :output
+ :if-exists :supersede)))
+ (format *queued-definitions-stream* "~A~%" def))
+
+(defun process-queued-definitions ()
+ (when *queued-definitions-stream*
+ (close *queued-definitions-stream*)
+ (compile-file *queued-definitions-pathname*)
+ (load (compile-file-pathname *queued-definitions-pathname*))
+;; (delete-file *queued-definitions-pathname*)
+;; (delete-file (compile-file-pathname *queued-definitions-pathname*))
+ (setq *queued-definitions-stream* nil)))
+