sclass AI_CalculationBot > AttractorBot { bool greet = true; run { if (greet) say("I can calculate things for you"); } // CONFIG class CalcAttractor > Attractor { S op; L arguments; public bool matches(S s) { LS l = regexpFirstGroups("(\\d+)\\s*[x*]\\s*(\\d+)", s); if (l(l) == 2) ret setOp(f mul, l); l = splitAtPlus(s); if (l(l) > 1 && all isInteger(l)) ret setOp(f plus, l); l = splitAtMinus(s); if (l(l) > 1 && all isInteger(l)) ret setOp(f minus, l); false; } bool setOp(S op, LS args) { this.op = op; arguments = map bigint(args); true; } run { say(str(foldl_noSeed(op, arguments))); } } *() { standardAttractors(new CalcAttractor); } }