func getInput(d dynamics.Dwimmer, context *term.SettingT, hintstrings, toolmap term.T) term.T { quotedHints, err := represent.ToList(d, hintstrings) if err != nil { return represent.ConversionError.T(hintstrings, err) } hints := make([]string, len(quotedHints)) for i, quoted := range quotedHints { hints[i], err = represent.ToStr(d, quoted) if err != nil { return represent.ConversionError.T(quoted, err) } } tools := make(map[rune]string) for toolmap.Head() != maps.Empty { switch toolmap.Head() { case maps.Cons: vs := toolmap.Values() c, err := represent.ToRune(d, vs[0]) if err != nil { return represent.ConversionError.T(vs[0], err) } s, err := represent.ToStr(d, vs[1]) if err != nil { return represent.ConversionError.T(vs[1], err) } tools[c] = s toolmap = vs[2] default: context.AppendTerm(UnrecognizedDictionary.T()) return nil } } input := d.Readln(" < ", hints, tools) return core.Answer.T(represent.Str(input)) }
func parseInput(d dynamics.Dwimmer, context *term.SettingT, quotedInput, quotedNames term.T) term.T { input, err := represent.ToStr(d, quotedInput) if err != nil { return represent.ConversionError.T(quotedInput, err) } quotedList, err := represent.ToList(d, quotedNames) if err != nil { return represent.ConversionError.T(quotedNames, err) } names := make([]string, len(quotedList)) for i, quoted := range quotedList { names[i], err = represent.ToStr(d, quoted) if err != nil { return represent.ConversionError.T(quoted, err) } } if input == "jump up" { return GoMeta.T() } a := parsing.ParseAction(input, names) if a == nil { c := parsing.ParseTerm(input, names) if c != nil { switch c := c.(type) { case *term.CompoundC: if questionLike(c) { a = new(term.ActionC) *a = term.AskC(c) } case term.ReferenceC: a = new(term.ActionC) *a = term.ViewC(c) } context.AppendTerm(IsTerm.T()) return nil } else { context.AppendTerm(ParseError.T()) return nil } } else { for _, n := range a.IntArgs { if n < 0 { context.AppendTerm(ParseError.T()) return nil } } return core.Answer.T(represent.ActionC(*a)) } }
//TODO only do this sometimes, or control better the length, or something... func GetHints(d dynamics.Dwimmer, context *term.SettingT, s *term.SettingS, n int) []string { suggestions, err := d.Answer(similarity.SuggestedActions.T( represent.Setting(s.Setting), represent.Int(n), ), context) if err != nil { return []string{} } suggestionList, err := represent.ToList(d, suggestions) if err != nil { return []string{} } result := []string{} for _, suggestion := range suggestionList { actionC, err := represent.ToActionC(d, suggestion) if err != nil { continue } actionS := actionC.Uninstantiate(s.Names) result = append(result, actionS.String()) } reverseHints(result) return result }