prosper/main.go

54 lines
1.1 KiB
Go

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")
}
}