When specifying a slot, a set of options can be given to the system. Each option is specified with a keywordndexfile(index-entry "keyword" "rm" main ). The list of authorised keywords is given below:
To illustrate slot description, we shall redefine the <complex> class
seen before. A definition could be:
unspecified
error
makeotherˆ`=̀13`
gobblecr(define-class <complex> (<number>) ((r :initform 0 :getter get-r :setter set-r! :init-keyword :r) (i :initform 0 :getter get-i :setter set-i! :init-keyword :i)))With this definition, the r and i slot are set to 0 by default. Value of a slot can also be specified by calling make with the :r and :i keywords. Furthermore, the generic functions get-r and set-r! (resp. get-i and set-i!) are automatically defined by the system to read and write the r (resp. i) slot.
gobblecr(define c1 (make <complex> :r 1 :i 2))(get-r c1) 1(set-r! c1 12)(get-r c1) 12(define c2 (make <complex> :r 2))(get-r c2) 2(get-i c2) 0
Accessors provide an uniform access for reading and writing an object slot.
Writing a slot is done with an extended form of set!ndexfile(index-entry "set!" "tt" aux )
which is close to the Common Lisp setf macro. So, another definition of the
previous <complex> class, using the :accessor option, could be:
unspecified
error
makeotherˆ`=̀13`
gobblecr(define-class <complex> (<number>) ((r :initform 0 :accessor real-part :init-keyword :r) (i :initform 0 :accessor imag-part :init-keyword :i)))
Using this class definition, reading the real part of the c complex can
be done with:
unspecified
error
makeotherˆ`=̀13`
gobblecr(real-part c)and setting it to the value contained in the new-value variable can be done using the extended form of set!.
gobblecr(set! (real-part c) new-value)
Suppose now that we have to manipulate complex numbers with rectangular coordinates as well as with polar coordinates. One solution could be to have a definition of complex numbers which uses one particular representation and some conversion functions to pass from one representation to the other. A better solution uses virtual slots. A complete definition of the <complex> class using virtual slots is given in Figure 2.
This class definition implements two real slots (r and i). Values
of the m and a virtual slots are calculated from real slot
values. Reading a virtual slot leads to the application of the function
defined in the :slot-refndexfile(index-entry ":slot-ref" "tt" aux ) option. Writing such a slot
leads to the application of the function defined in the :slot-set!ndexfile(index-entry ":slot-set!" "tt" aux ) option.
For instance, the following expression
unspecified
error
makeotherˆ`=̀13`
gobblecr(slot-set! c 'a 3)permits to set the angle of the c complex number. This expression conducts, in fact, to the evaluation of the following expression
gobblecr((lambda o m) (let ((m (slot-ref o 'm))) (slot-set! o 'r (* m (cos a))) (slot-set! o 'i (* m (sin a)))) c 3)A more complete example is given below:
gobblecr(define c (make <complex> :r 12 :i 20))(real-part c) 12(angle c) 1.03037682652431(slot-set! c 'i 10)(set! (real-part c) 1)(describe c) #[<complex> 128bf8] is an instance of class <complex> Slots are: r = 1 i = 10 m = 10.0498756211209 a = 1.47112767430373
Since initialization keywords have been defined for the four slots, we
can now define the ndexfile(index-entry "make-rectangular" "tt" aux )make-rectangular and ndexfile(index-entry "make-polar" "tt" aux )make-polar
standard Scheme primitives.
unspecified
error
makeotherˆ`=̀13`
gobblecr(define make-rectangular (lambda (x y) (make <complex> :r x :i y)))(define make-polar (lambda (x y) (make <complex> :magn x :angle y)))