auto stage = new BasicStage();
auto value = lift(40) + 2;
assert(stage.eval(value) == 42);
auto stage = new BasicStage();
auto slot = stage.slot!string("some.slot");
assert(slot.name == "some.slot");
auto expr = slot ~ ", world!";
assertThrows(stage.eval(expr));
stage["some.slot"] = lift("Hello");
assert(stage.eval(expr) == "Hello, world!");
auto laterStage = new BasicStage();
laterStage.slot(slot);
assertThrows(laterStage.eval(slot));
laterStage["some.slot"] = lift("Bye");
assert(stage.eval(expr) == "Bye, world!");
auto stage = new BasicStage();
int[] trace; // our primitive trace buffer
auto v1 = stage.slot!double("var1").map(delegate double(double x) {
trace ~= 1;
return x;
});
auto v2 = stage.slot!double("var2").map(delegate double(double x) {
trace ~= 2;
return x;
});
stage["var1"] = lift(1.5);
auto part = (v1 + v2).partial(stage);
stage["var2"] = lift(-0.5);
// first pass - both map functions called once
assert(part.eval(stage) == 1.0);
assert(trace == [1, 2]);
// second pass - only v2 is evaluated
assert(part.eval(stage) == 1.0);
assert(trace == [1, 2, 2]);