1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
Environment : IdentityDictionary {
classvar <>stack;
*make { arg function;
^this.new.make(function)
}
*use { arg function;
^this.new.use(function)
}
make { arg function;
// pushes the Envir, executes function, returns the Envir
// usually used to create an environment by adding new variables to it.
var result, saveEnvir;
saveEnvir = currentEnvironment;
currentEnvironment = this;
protect {
function.value(this);
}{
currentEnvironment = saveEnvir;
};
}
use { arg function;
// temporarily replaces the currentEnvironment with this,
// executes function, returns the result of the function
var result, saveEnvir;
saveEnvir = currentEnvironment;
currentEnvironment = this;
protect {
result = function.value(this);
}{
currentEnvironment = saveEnvir;
};
^result
}
eventAt { arg key; ^this.at(key) }
composeEvents { arg event; ^this.copy.putAll(event) }
*pop {
if(stack.notNil and: { stack.notEmpty }) { currentEnvironment = stack.pop };
}
*push { arg envir;
stack = stack.add(currentEnvironment);
currentEnvironment = envir;
}
pop { ^this.class.pop }
push { this.class.push(this) }
linkDoc { arg doc;
doc = doc ? Document.current;
doc.envir_(this);
}
unlinkDoc { arg doc;
doc = doc ? Document.current;
if(doc.envir === this) { doc.envir_(nil) };
}
}
|