package main import ( "fmt" "io/ioutil" "log" "os" "strings" "github.com/chzyer/readline" "github.com/hellerve/argos/eval" "github.com/hellerve/argos/parser" ) func runRepl() { rl, err := readline.New("argos> ") if err != nil { log.Fatal(err) } defer rl.Close() e := eval.ParentEnv() for { input, err := rl.Readline() if err != nil { return } parsed, err, unconsumed := parser.Parse(input) if err != nil { fmt.Println(err) continue } if len(unconsumed) != 0 { fmt.Println("Unconsumed input:", strings.Join(unconsumed, " ")) continue } // TODO: how to avoid bindings on error? evald, err := eval.Eval(parsed, e) if err != nil { fmt.Println(err) continue } fmt.Println(evald.Pretty()) } } func runFile(path string) { e := eval.ParentEnv() input, err := ioutil.ReadFile(path) if err != nil { fmt.Println(err) return } parsed, err, unconsumed := parser.Parse(string(input)) if err != nil { fmt.Println(err) return } if len(unconsumed) != 0 { fmt.Println("Unconsumed input:", strings.Join(unconsumed, " ")) return } evald, err := eval.Eval(parsed, e) if err != nil { fmt.Println(err) return } fmt.Println(evald.Pretty()) } func main() { args := os.Args if len(args) == 1 { runRepl() } else { runFile(os.Args[1]) } }