Gang: I now understand a bit more about initialization of static variables -- more accurately, about execution of top-level code -- and while it's not earth-shattering, I thought I'd pass it along. It may avoid some astonishment. The rules are simple, but are different than I thought: -- top level forms INSIDE a class definition are executed every time an instance of that class is created. -- top level forms OUTSIDE of a class definition are executed once when the file loads. To see the implication on initializing a static variable, consider the following: ===== file: t1.ck public class Statix { // UNO is set with to new value at every call to 'new Statix' static Object @ UNO; (new Object) @=> UNO; // DUE is set once after the first call to 'new Statix' static Object @ DUE; if (DUE == null) (new Object) @=> DUE; // TRE is set once when the file is loaded (see below) static Object @ TRE; <<< "at a: UNO=", Statix.UNO, "DUE=", Statix.DUE, "TRE=", Statix.TRE >>>; } <<< "at b: UNO=", Statix.UNO, "DUE=", Statix.DUE, "TRE=", Statix.TRE
; (new Statix) @=> Statix.TRE; <<< "at c: UNO=", Statix.UNO, "DUE=", Statix.DUE, "TRE=", Statix.TRE ;
===== file: t2.ck <<< "at d: UNO=", Statix.UNO, "DUE=", Statix.DUE, "TRE=", Statix.TRE
; new Statix @=> Statix @ _t1; <<< "at e: UNO=", Statix.UNO, "DUE=", Statix.DUE, "TRE=", Statix.TRE ; new Statix @=> Statix @ _t2; <<< "at f: UNO=", Statix.UNO, "DUE=", Statix.DUE, "TRE=", Statix.TRE ;
===== the output: % chuck t1.ck t2.ck at b: UNO= 0x0 DUE= 0x0 TRE= 0x0 at a: UNO= 0x5e5aa0 DUE= 0x5e5af0 TRE= 0x0 at c: UNO= 0x5e5aa0 DUE= 0x5e5af0 TRE= 0x5e6670 at d: UNO= 0x5e5aa0 DUE= 0x5e5af0 TRE= 0x5e6670 at a: UNO= 0x5e6ba0 DUE= 0x5e5af0 TRE= 0x5e6670 at e: UNO= 0x5e6ba0 DUE= 0x5e5af0 TRE= 0x5e6670 at a: UNO= 0x5e6c00 DUE= 0x5e5af0 TRE= 0x5e6670 at f: UNO= 0x5e6c00 DUE= 0x5e5af0 TRE= 0x5e6670