[Gauche-devel-jp] Re: スロット変更にて自動起動するメソッド

Back to archive index

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)
))




Gauche-devel-jp メーリングリストの案内
Back to archive index