예제 #1
0
func main() {
	world := eval.NewWorld()
	var fset = token.NewFileSet()
	r := bufio.NewReader(os.Stdin)
	for {
		print("# ")
		line, err := r.ReadString('\n')
		if err != nil {
			break
		}
		code, err := world.Compile(fset, line+";")
		if err != nil {
			fmt.Fprintln(os.Stderr, err)
			continue
		}
		ret, err := code.Run()
		if err != nil {
			fmt.Fprintln(os.Stderr, err)
			continue
		}
		if ret != nil {
			println(ret.String())
		}
	}
}
예제 #2
0
func main() {
	world := eval.NewWorld()
	var fset = token.NewFileSet()
	r := bufio.NewReader(os.Stdin)
	for {
		func() {
			defer func() {
				recover()
			}()
			fmt.Print("# ")
			line, err := r.ReadString('\n')
			if err != nil {
				return
			}
			code, err := world.Compile(fset, line+"\n")
			if err != nil {
				fmt.Fprintln(os.Stderr, err)
				return
			}
			ret, err := code.Run()
			if err != nil {
				fmt.Fprintln(os.Stderr, err)
				return
			}
			if ret != nil {
				fmt.Println(ret.String())
			}
		}()
	}
}
예제 #3
0
파일: config.go 프로젝트: remogatto/goam
// Reads the specified config file
func readConfig(config *config_file_t) error {
	var err error

	configCurrent_mutex.Lock()
	{
		if *flag_debug {
			println("read config:", config.path)
		}

		currentConfig = config

		w := eval.NewWorld()
		defineConstants(w)
		defineFunctions(w)
		err = loadAndRunScript(w, config.path)

		currentConfig = nil
	}
	configCurrent_mutex.Unlock()

	if err != nil {
		err = errors.New(config.Path() + ": " + err.Error())
	}

	return err
}
func main() {
	w := eval.NewWorld()
	fset := token.NewFileSet()

	code, err := w.Compile(fset, "1 + 2")
	if err != nil {
		fmt.Println("Compile error")
		return
	}

	val, err := code.Run()
	if err != nil {
		fmt.Println("Run time error")
		return
	}
	fmt.Println("Return value:", val) //prints, well, 3

}
예제 #5
0
파일: eval.go 프로젝트: Bobberino/musings
func main() {
	flag.Parse()
	w := eval.NewWorld()
	if *filename != "" {
		data, err := ioutil.ReadFile(*filename)
		if err != nil {
			fmt.Println(err.Error())
			os.Exit(1)
		}
		file, err := parser.ParseFile(fset, *filename, data, 0)
		if err != nil {
			fmt.Println(err.Error())
			os.Exit(1)
		}
		files := []*ast.File{file}
		code, err := w.CompilePackage(fset, files, "main")
		if err != nil {
			if list, ok := err.(scanner.ErrorList); ok {
				for _, e := range list {
					fmt.Println(e.Error())
				}
			} else {
				fmt.Println(err.Error())
			}
			os.Exit(1)
		}
		code, err = w.Compile(fset, "main()")
		if err != nil {
			fmt.Println(err.Error())
			os.Exit(1)
		}
		_, err = code.Run()
		if err != nil {
			fmt.Println(err.Error())
			os.Exit(1)
		}
		os.Exit(0)
	}

	r := bufio.NewReader(os.Stdin)
	for {
		print("; ")
		line, err := r.ReadString('\n')
		if err != nil {
			break
		}
		code, err := w.Compile(fset, line)
		if err != nil {
			println(err.Error())
			continue
		}
		v, err := code.Run()
		if err != nil {
			println(err.Error())
			continue
		}
		if v != nil {
			println(v.String())
		}
	}
}
예제 #6
0
파일: main.go 프로젝트: abi/dotfiles
func main() {
	defer atexit()

	flag.Parse()
	w := eval.NewWorld()
	if *filename != "" {
		data, err := ioutil.ReadFile(*filename)
		if err != nil {
			fmt.Println(err.String())
			os.Exit(1)
		}
		file, err := parser.ParseFile(fset, *filename, data, 0)
		if err != nil {
			fmt.Println(err.String())
			os.Exit(1)
		}
		files := []*ast.File{file}
		code, err := w.CompilePackage(fset, files, "main")
		if err != nil {
			if list, ok := err.(scanner.ErrorList); ok {
				for _, e := range list {
					fmt.Println(e.String())
				}
			} else {
				fmt.Println(err.String())
			}
			os.Exit(1)
		}
		code, err = w.Compile(fset, "main()")
		if err != nil {
			fmt.Println(err.String())
			os.Exit(1)
		}
		_, err = code.Run()
		if err != nil {
			fmt.Println(err.String())
			os.Exit(1)
		}
		os.Exit(0)
	}

	var ierr os.Error = nil // previous interpreter error
	ps1 := "igo> "
	ps2 := "...  "
	prompt := &ps1
	codelet := ""
	// initialize main package
	{
		codelet := "package main\n"
		f, err := parser.ParseFile(fset, "input", codelet, 0)
		code, err := w.CompilePackage(fset, []*ast.File{f}, "main")
		if err == nil {
			code.Run()
		}
	}
	for {
		line := readline.ReadLine(prompt)
		if line == nil {
			break //os.Exit(0)
		}
		if *line == "" || *line == ";" {
			// no more input
			prompt = &ps1
		}
		codelet += *line
		readline.AddHistory(codelet)
		code, err := w.Compile(fset, codelet+";")
		if err != nil {
			if ierr != nil && prompt == &ps1 {
				fmt.Println(err.String())
				fmt.Printf("(error %T)\n", err)
				// reset state
				codelet = ""
				ierr = nil
				prompt = &ps1
				continue
			}
			// maybe multi-line command ?
			prompt = &ps2
			ierr = err
			codelet += "\n"
			continue
		}
		v, err := code.Run()
		if err != nil {
			fmt.Println(err.String())
			fmt.Printf("(error %T)\n", err)
			codelet = ""
			continue
		}
		if v != nil {
			fmt.Println(v.String())
		}
		//	resetstate:
		// reset state
		codelet = ""
		ierr = nil
	}
}