func AddNativeTo(table *TransitionTable, s *term.SettingS, f func(Dwimmer, *term.SettingT, ...term.T) term.T, names ...string) { indices := make([]int, len(names)) for i, name := range names { for j, key := range s.Names { if name == key { indices[i] = j } } } g := func(d Dwimmer, s *term.SettingT) term.T { args := make([]term.T, len(indices)) for i, index := range indices { args[i] = s.Args[index] } s.AppendAction(term.AskC(NativeQ.C())) result := f(d, s, args...) if result != nil { s.AppendTerm(core.Answer.T(result)) s.AppendAction(term.ReturnC(term.Cr(len(s.Args) - 1))) } return result } table.Save(s.Setting, NativeTransition(g)) }