!7 sS data = [[ -- rule 1 who is x y [input] + x y is a trader [statement] => a trader -- test input john doe is a guy who is john doe? -- expected output a guy ]]; static new L> rules; // text, comment, ID static new L fulfillments; p-exp { TreeMap sections = minusSignSectionsCI(data); for (S ruleID, ruleText : keysStartingWith(sections, "rule")) { new LS comments; LS lines = tlft(ruleText); for i over lines: { S s = lines.get(i); PairS p = splitTrailingSquareBracketStuff(s); if (nempty(p.b)) comments.add("in " + (i+1) + " = " + p.b); lines.set(i, p.a); } rules.add(t3(lines(lines), lines(comments), ruleID)); } dm_gazelle_wireStatementConditions(); pnlStruct(rules); new LS lines; for (S input : tlft(sections.get("test input"))) { gazelle_gatherFulfillments(ll(nu GazelleLine(text := input)), fulfillments, debug := true); //GazelleEvalContext ctx = gazelle_stdEvalContext(rules); lines.add(printLines(collect line(dm_gazelle_reasonAboutChatInput(null, input, requiredComment := null, debug := true)))); } assertEqualsVerbose(lines, tlft(sections.get("expected output"))); } static L> dm_allRulesFromRulesModuleWithCommentsAndIDs() { ret rules; } svoid dm_gazelle_setRuleComments_verbose(S ruleID, S comments) { set(objectWhere(rules, c := ruleID), b := comments); } static PairS dm_textAndCommentForRule(S ruleID) { T3 t = objectWhere(rules, c := ruleID); ret t == null ? null : pair(t.a, t.b); } static Pair dm_gazelle_addRuleWithComment(S text, S comment) { T3 t = objectWhere(rules, a := text, b := comment); if (t != null) ret pair(t.c, false); S id = aGlobalID(); rules.add(t3(text, comment, id)); ret pair(id, true); } static L dm_gazelle_fulfillmentsForRule(S ruleID) { ret objectsWhere(fulfillments, rule := ruleID); } static GazelleEvalContext dm_gazelle_stdEvalContext() { ret dm_gazelle_stdEvalContext(dm_allRulesFromRulesModuleWithCommentsAndIDs()); } static GazelleEvalContext dm_gazelle_stdEvalContext(L> rules) { ret gazelle_stdEvalContext(rules); }