!7 set flag DynModule. sclass TelegramFactsBot > AbstractTelegramThinkBot { S evalExp(Exp e) { S code = nlLogic_text(e); print("Eval'ing: " + code); temp tempAdd(hotwire_copyOver_after, voidfunc(Class c) { copyFields(mc(), c, 'telegram_msg_tl) }); S result = str(javaEval(code)); print("Result: " + shorten(result, 100)); ret result; } void thinkAbout(fS s) { NLLogicChecker_v2 c = new NLLogicChecker_v2 { L entities; bool checkExpression(Exp e, Matching m) { if (e cast Func) { if (eq(e.name, "verbPhraseFromThirdPerson")) ret nlLogic_stringFunction(f ai_verbPhraseFromThirdPerson, e, m.matches); else if (eq(e.name, "singular")) ret nlLogic_stringFunction(f singular, e, m.matches); else if (eq(e.name, 'eval)) ret eq("true", evalExp(e.arg)); else if (eq(e.name, 'entity)) { if (entities == null) { long time = sysNow(); entities = map nlLogic_text(ai_extractEntities_v1(s)); print("Entities (" + elapsedMS(time) + " ms): " + joinWithComma(entities)); } for (S entity : entities) if (matcher.match(nlLogic_text(e.arg), entity, m.matches)) true; } } if (e cast Eq) { Exp r = e.right; S var = nlLogic_text(e.left); if (r cast Func) pcall { if (eq(r.name, 'eval)) ret new NLStringMatcher_singleDollarVar().match(var, evalExp(r.arg), m.matches); } } ret super.checkExpression(e, m); } }; c.matcher = new NLStringMatcher_dollarVars_underscores; c.input = s; c.facts = mL_facts(); L unparsedRules = combineWithGlobalIDs(ai_unparsedTalkRules()); unparsedRules = sortedByCalculatedField(unparsedRules, func(Pair p) { jcontains(p.b, "entity(") }); L> rules = mapPairB_pcall nlLogic_parseRule(unparsedRules); for (Pair p : rules) { IfThen r = p.b, out = r.out; if (out cast Func) if (eq(out.name, "sayIfTrue")) { r.out = Func('output, out.arg); r.left = And(r.left, Func('fact, out.arg)); print(r); } } applyNLLogicFacts_v2(c, voidfunc(S s) { postMessage(s) }, rules); } }