> From: Erick Gallesio <eg_at_kaolin.unice.fr>
> Date: Tue, 13 Jan 1998 10:07:13 +0100
> For instance:
> (define setter! #f)
> (define getter #f)
>
> (let ((var 0))
> (set! getter (lambda (o) var))
> (set! setter! (lambda (o v) (set! var v))))
>
> (define-class <foo> ()
> ((slot :allocation :virtual :slot-set! setter! :slot-ref getter)))
I think by this method all the instances of class <foo> shares the
same virtual cell (closed variable "var"), so it will behave like
:allocation :class. Also it won't work with :initform option
(see the Erick's comment in stklos.stk).
When I want to have per-instance slots with custom slot-set! and
slot-ref, usually I create a vector for each instance to hold
"hidden" values. (Still the vector itself is not hidden.
I don't know how to hide it completely)
(define-class <foo-meta> (<class>)
((hidden-slot-count :initform 0)))
(define-method compute-get-n-set ((class <foo-meta>) s)
(if (eqv? (get-slot-allocation s) :hidden)
(let* ((index (slot-ref class 'hidden-slot-count))
;; you can add any features to following getter and setter
(getter (lambda (o) (vector-ref (slot-ref o 'values) index)))
(setter (lambda (o v) (vector-set! (slot-ref o 'values) index v))))
(slot-set! class 'hidden-slot-count (+ index 1))
(list getter setter))
(next-method)))
(define-class <foo> ()
((values)
(x :allocation :hidden))
:metaclass <foo-meta>)
(define-method initialize ((self <foo>) initargs)
(slot-set! self 'values
(make-vector (slot-ref (class-of self) 'hidden-slot-count)))
(next-method))
--
Shiro KAWAI
Square USA Inc. Honolulu Studio R&D division
#"The most important things are the hardest things to say" --- Stephen King
Received on Tue Jan 13 1998 - 22:45:59 CET