[Next] [Previous] [Up] [Top] [Contents] [Index]
2 Dynamically-Typed Core
Object state, such as instance variables and class variables, is supported in Cecil through fields and associated accessor methods. To define a mutable instance variable x
for a particular object obj
, the programmer can declare a field
of the following form:
var field x(@obj);
This declaration allocates space for an object reference in the obj
object and constructs two real methods attached to the obj
object that provide the only access to the variable:
method x(v@obj) { prim rtl { <v.x>
} } -- the get accessor method method set_x(v@obj, value) { prim rtl { <v.x>
:= value; } } -- the set accessor method
The get accessor method returns the contents of the hidden variable. The set accessor method mutates the contents of the hidden variable to refer to a new object, and returns void
. Accessor methods are specialized on the object containing the variable, thus establishing the link between the accessor methods and the object. For example, sending the x
message to the obj
object will find and invoke the get accessor method and return the contents of the hidden variable, thus acting like a reference to obj
's x
instance variable. (Section 5 describes how these accessor methods can be encapsulated within the data abstraction implementation and protected from external manipulation.)
To illustrate, the following declarations define a standard list inheritance hierarchy:
object list isa ordered_collection; method is_empty(l@list) { l.length = 0 } method prepend(x, l@list) { -- dispatch on second argument object isa cons { head := x, tail := l } } object nil isa list; -- empty list method length(@nil) { 0 } method do(@nil, ) {} -- iterating over all elements of the empty list: do nothing method pair_do(@nil, , ) {} method pair_do(, @nil, ) {} method pair_do(@nil, @nil, ) {} object cons isa list; -- non-empty lists var field head(@cons); -- defines head(@cons) and set_head(@cons, ) accessor methods var field tail(@cons); -- defines tail(@cons) and set_tail(@cons, ) accessor methods method length(c@cons) { 1 + c.tail.length } method do(c@cons, block) { eval(block, c.head); -- call block on head of list do(c.tail, block); } -- recur down tail of list method pair_do(c1@cons, c2@cons, block) { eval(block, c1.head, c2.head); pair_do(c1.tail, c2.tail, block); }
The cons
object has two fields, only accessible through the automatically-generated accessor methods.
The syntax of field declarations, excluding static typing aspects and encapsulation, is as follows:
field_decl ::= ["shared"] ["var"] "field" method_name "(" formal ")" {pragma} [":=" expr] ";"
[Next] [Previous] [Up] [Top] [Contents] [Index]
Generated with Harlequin WebMaker