sclass VarBasedArithmeticEngine { MapSO vars = syncTreeMap(); sclass NotRunYet {} static new NotRunYet notRunYet; abstract record MultiOp(LS inVars, S outVar) implements Runnable { O value = notRunYet; abstract O perform(L values); *(S... vars) { outVar = last(vars); inVars = asListMinusLast(vars); } run { get(); } O get() { value = perform(map getVar(inVars); setVar(outVar, value); ret value; } } macro ctors { *(LS *inVars, S *outVar) {} *(S... vars) { super(vars); } } // add doubles persistent class DAdd > MultiOp { ctors Double perform(L values) { ret doubleSum(allToDouble(values)); } } // multiply doubles persistent class DMul > MultiOp { ctors Double perform(L values) { ret doubleProduct(allToDouble(values)); } } // subtract doubles (a-b-c...) persistent class DMinus > MultiOp { ctors Double perform(L values) { ret doubleMultiMinus(allToDouble(values)); } } // division (a/b/c...) with division by zero giving 0 persistent class DDiv > MultiOp { ctors Double perform(L values) { ret doubleMultiRatio(allToDouble(values)); } } O getVar aka get(S var) { ret vars.get(var); } void setVar aka set(S var, O value) { if (var != null) vars.put(var, value); } *(O... _) { addParamsToMap_inPlace(vars, _); } }