IE> Unfortunately aref is not a generic function so you'd have to play IE> package naming games to hijack it which I abhor. I'm open to IE> suggestions on ways to handle such an idiom, but nothing has come to IE> mind yet. A macro to create slot accessors that do all the IE> bookkeeping automatically might be useful as an option for users.
i'm not sure what do you mean by this macro (maybe you mean the same thing?), but i think there is a way to track modifications: object should track all the stuff that was read via slot-value, caching it, and write all this stuff during commit. i.e. on "user level" we can emulate it in such way: (defparameter *slots-touched* ()) (defun cached-slot-value (o s) (let ((k (cons o s))) (multiple-value-bind (value found) (gethash k *slots-touched*) (if found value (setf (gethash k *slots-touched*) value))))) ;; setf cached-slot-value should be also implemented (defun commit-cached-slots () (loop for (o . s) being each hash-key of *slots-touched* using (hash-value value) do (setf (slot-value o s) value))) (ele:with-transaction () (let ((*slots-touched* (make-hash-table :test 'equalp))) (setf (aref (cached-slot-value obj 'array) 5) 3) (commit-cached-slots))) this won't work with changes done outside a transaction, but I think that's OK: use explicit transactions or die! also, this could be a huge performance impact, but i think it can be mitigated via hashing: i.e. in cached-slot-value we snapshot a sxhash of the value. during commit we check if sxhash was changed -- if it was, we write new slot value into a database, otherwise we don't. we can also skip all immutable values. with this checks, performance impact should be barely noticable (comparing to deseralization costs), so it should be OK. _______________________________________________ elephant-devel site list elephant-devel@common-lisp.net http://common-lisp.net/mailman/listinfo/elephant-devel