func loadFile(fileName string, env interpreter.Env) { if len(fileName) > 0 { content, err := util.ReadFile(fileName) if err != nil { fmt.Printf("Error while loading file <%v>: %v\n", fileName, err.Error()) } else { interpreter.ParseEvalPrint(env, content, fileName, false) } } }
func main() { startupFileName := flag.String("l", "", "load a file at startup") showHelp := flag.Bool("help", false, "show the help") flag.Parse() exeFileName := flag.Arg(0) if showHelp != nil && *showHelp { fmt.Printf("Usage of piquant:\n") flag.PrintDefaults() return } // Setup liner line := liner.NewLiner() defer line.Close() openLinerHistory(line) configureLiner(line) // Initialize topLevelEnv := interpreter.NewTopLevelMapEnv() if len(exeFileName) != 0 { loadFile("prelude.v", topLevelEnv) loadFile(exeFileName, topLevelEnv) return } fmt.Printf("Piquant %s (%s)\n", version, versionDate) loadFile("prelude.v", topLevelEnv) fmt.Printf("(Press Ctrl+C or type :quit to exit)\n\n") // Loading of files if startupFileName != nil { loadFile(*startupFileName, topLevelEnv) } // REPL for { input, err := line.Prompt("> ") if err != nil { if err.Error() == "prompt aborted" { fmt.Printf("Quiting...\n") } else { fmt.Printf("Prompt error: %s\n", err) } return } line.AppendHistory(input) writeLinerHistory(line) switch { case input == ":quit": return case strings.HasPrefix(input, ":inspect "): withoutInspectPrefix := strings.Split(input, ":inspect ")[1] if result, err := interpreter.ParseEval(topLevelEnv, withoutInspectPrefix, "REPL"); err == nil { inspect(result) } else { fmt.Println(err.Error()) } default: interpreter.ParseEvalPrint(topLevelEnv, input, "REPL", true) } } }