!7 concept Rule { CtxRule1 source; Explain explain; } p { L rules = ctxFindRules(#1200000); print("Found " + n(rules, "rules")); for (CtxRule1 rule : rules) { Explain e = explain(rule.text(), ctxParsingRules(), "rule"); if (e == null) print("Bad rule: " + rule.text()); else { cnew(Rule, source := rule, explain := e); } } evalRulesOnString("wie geht es dir"); botSleep(); } sS answer(S s) { ret evalRulesOnString(s); } static S evalRulesOnString(S s) { for (Rule rule) { if (eval(rule.explain, s)) print("Fire! " + rule.source.file); } ret ""; } static bool eval(Explain e, S input) { Explain exp = e.find("exp"); if (exp == null) todo(e.className()); if (exp.has("bracket")) ret eval(exp.sub(0)); if (exp.has("and")) ret eval(exp.sub(0), input) && eval(exp.sub(1), input); if (exp.has("or")) ret eval(exp.sub(0), input) || eval(exp.sub(1), input); if (exp.has("quoted")) { print("Eval quoted: " + exp); true; } throw todo(e.className()); }