Warning: session_start(): open(/var/lib/php/sessions/sess_87i2bs4jluontncn3ffuq1fris, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
sclass VarBasedArithmeticEngine {
MapSO vars = syncTreeMap();
sclass NotRunYet {}
static new NotRunYet notRunYet;
record SetVar(S var, O value) is Runnable {
run { setVar(var, value); }
}
// SINGLE-OPS (one input variable, one output variable)
macro ctors {
*() {}
*(S *inVar, S *outVar) {}
}
abstract noeq record SingleOp(S inVar, S outVar) is Runnable {
transient O value = notRunYet;
abstract O perform(O arg);
run { get(); }
O get() {
value = perform(getVar(inVar));
setVar(outVar, value);
ret value;
}
}
class Sqrt > MultiOp { ctors
Double perform(O arg) {
ret sqrt(toDouble(arg));
}
}
// MULTI-OPS (multiple input variables, one output variable)
abstract noeq record MultiOp(LS inVars, S outVar) is Runnable {
transient 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
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...)
class DMinus > MultiOp { ctors
Double perform(L values) {
ret doubleMultiMinus(allToDouble(values));
}
}
// division (a/b/c...) with division by zero giving 0
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, _);
}
}