This mechanism is most often used to obtain a reference to the current module instance with a restriction of its module type to a compatible subtype (eg, containing a subset of the current module's declarations). For example, given modules of the following types:
T: module { init: fn(nil: ref Draw->Context, nil: list of string); special: fn(a, b: int); }; S: module { special: fn(x, y: int); }; G: module { init: fn(v: S); };
an instance of module T can execute both the following:
t := load T SELF; s := load S SELF;
but a module of type S could not load itself as type T.
The result might typically be assigned to a module variable of that type (including passing as a parameter or storing in an adt), as in:
g := load G "g.dis"; g->init(s);
See the definition and use of BufioFill in bufio(2) and bufio-chanfill(2) for a practical example.
SYS-SELF(2 ) | Rev: Thu Feb 15 14:43:27 GMT 2007 |