Katsutoshi Itoh
cut-s****@maste*****
2006年 6月 21日 (水) 11:51:53 JST
KIMURA Shigenobu wrote: > 例題作ろうとして ??? になってしまいました。orz. > 忘れてください。(_o_) > ありがとうございます。 ひとまず思っていた動作まではこぎつけたようです。 実際にはKahuaの永続クラスと混合して使っており、 restartすると常に更新されてしまうという問題があるので 引き続きいじらないといけませんが、それはまた別の問題 ということで。。。 一応mtimeとかそういう名称にベッタリなので汎用的ではないですが、 以下のメタクラスを用意してOKそうでした。 ---------- ; ; <auto-update-meta> ; (define-class <auto-update-meta> (<class>) ()) (define-method compute-get-n-set ((class <auto-update-meta>) slot) (let1 auto? (slot-definition-option slot :auto-update #t) (if auto? (let* ((acc (compute-slot-accessor class slot (next-method))) (getter (lambda (o) (slot-ref-using-accessor o acc))) (bound? (lambda (o) (slot-bound-using-accessor? o acc))) (setter (lambda (o v) (slot-set-using-accessor! o acc v) (set! (ref o 'mtime) (current-date))))) (list getter setter bound? #t)) (next-method)))) (define-class <auto-update-mixin> () () :metaclass <auto-update-meta>) ; ; <tudura-base> ; (define-class <tudura-base> (<auto-update-mixin> <kahua-persistent-base>) ((%ctime :allocation :persistent :init-keyword :%ctime :init-form (time->seconds (date->time-utc (current-date))) :auto-update #f :accessor %ctime-of) (ctime :allocation :virtual :getter ctime-of :slot-ref (lambda (o) (time-utc->date (seconds->time (ref o '%ctime)))) :auto-update #f) (%mtime :allocation :persistent :init-keyword :%mtime :init-form (time->seconds (date->time-utc (current-date))) :auto-update #f :accessor %mtime-of) (mtime :allocation :virtual :accessor mtime-of :slot-ref (lambda (o) (time-utc->date (seconds->time (ref o '%mtime)))) :slot-set! (lambda (o d) (set! (ref o '%mtime) (time->seconds (date->time-utc d)))) :auto-update #f) (delete :allocation :persistent :init-keyword :delete :init-value #f :accessor delete-of) ))