1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- package main
- import (
- "log"
- "os"
- "path/filepath"
- )
- import "gitlab.com/beoran/muesli"
- import "github.com/peterh/liner"
- type LogTracer struct {
- }
- func (t * LogTracer) Trace(vm muesli.VM, ast muesli.Ast, val muesli.ListValue) bool {
- log.Printf("Trace: %s %v", ast.String(), val)
- return false
- }
- func runLine(vm *muesli.VM, in string) error {
- parser := muesli.NewParserFromString(in)
- ast := parser.Parse()
- err := ast.ToError()
- if err != nil {
- return err
- }
- vm.RunAst(*ast, muesli.NewListValue())
-
- return nil
- }
- func runLines(vm *muesli.VM, line *liner.State) error {
- for {
- if in, err := line.Prompt("> "); err == nil {
- err = runLine(vm, in)
- if err != nil {
- log.Print("Error %s: ", err)
- }
- line.AppendHistory(in)
- } else if err == liner.ErrPromptAborted {
- log.Print("Aborted")
- return nil
- } else {
- log.Print("Error reading line: ", err)
- }
- }
- return nil
- }
- func main() {
- vm := muesli.NewVM()
- vm.Tracer = &LogTracer{}
- vm.RegisterBuiltins()
- line := liner.NewLiner()
- defer line.Close()
- line.SetCtrlCAborts(true)
- home, _ := os.UserHomeDir()
- historyName := filepath.Join(home, ".muesli_history")
- /* line.SetCompleter(func(line string) (c []string) {
- for _, n := range names {
- if strings.HasPrefix(n, strings.ToLower(line)) {
- c = append(c, n)
- }
- }
- return
- })
- */
- if f, err := os.Open(historyName); err == nil {
- line.ReadHistory(f)
- f.Close()
- }
-
- runLines(vm, line)
-
- if f, err := os.Create(historyName); err != nil {
- log.Print("Error writing history file: ", err)
- } else {
- line.WriteHistory(f)
- f.Close()
- }
- }
|