// VarContext is thread-safe AFTER the first variable has been defined // or after you call makeThreadSafe(), whichever comes first sclass VarContext { gettable VarContext parent; MapSO vars; *() {} *(VarContext *parent) {} O get(S name) { if (containsKey(vars, name)) ret mapGet(vars, name); if (parent != null) ret parent.get(name); null; } void set aka put(S name, O value) { vars = putOrCreateSyncMap(vars, name, value); } AutoCloseable tempSet(S name, O value) { initMap(); ret tempPut(vars, name, value); } void unset(S name) { remove(vars, name); } void printMe { pnl(vars); print(+parent); } void makeThreadSafe aka initMap { vars if null = syncHashMap(); } // mechanism for returning from a script settable O exitFromScript; settable O returnValue; bool exiting() { ping(); ret exitFromScript != null; } }