Change your MSDscript implementation to use environments instead of substitution. The change includes

 

For tests, it’s almost certainly a good idea to define empty instead of writing new EmptyEnv() many times. You may even want to declare empty as a static variable of Env in "env.h":

CLASS(Env) {
....
static PTR(Env) empty;
};

and initialize it "env.cpp" with

PTR(Env) Env::empty = NEW(EmptyEnv)();

Then, you can use Empty::env anywhere that "env.h" is included.