package main import ( "bufio" "fmt" "os" "strings" ) func main() { stack := Stack{values: []int{}} dict := Dictionary{} b := &Builtins{} dict.AddWord("+", b.Add(&stack), "") dict.AddWord("-", b.Sub(&stack), "") dict.AddWord("*", b.Mul(&stack), "") dict.AddWord("/", b.Div(&stack), "") dict.AddWord(".", b.Print(&stack), "") dict.AddWord("DUP", b.Dup(&stack), "") dict.AddWord("SWAP", b.Swap(&stack), "") dict.AddWord("OVER", b.Over(&stack), "") dict.AddWord("DROP", b.Drop(&stack), "") dict.AddWord("ROT", b.Rot(&stack), "") dict.AddWord("WORDS", b.Words(dict), "") dict.AddWord(".S", b.Debug(&stack), "") dict.AddWord("CR", b.CR(), "") c := Context{ Dictionary: dict, Stack: &stack, } reader := bufio.NewReader(os.Stdin) fmt.Print("prosper") // read loop for { fmt.Print("\n> ") line, err := reader.ReadString('\n') if err != nil { fmt.Println(err.Error()) os.Exit(1) } line = strings.TrimSpace(line) err = c.Eval(line + " ") // append a space to make sure we always close out our parse loop if err != nil { fmt.Printf("error in evaluation: %v\n", err) } fmt.Print("ok") } }