You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
49 lines
995 B
49 lines
995 B
package main |
|
|
|
import ( |
|
"strconv" |
|
"os" |
|
"strings" |
|
) |
|
|
|
func prelude() { |
|
dictionary[":"] = operation{op: newop, readuntil: ";"} |
|
dictionary["base"] = operation{op: base} |
|
dictionary["+"] = operation{op: add} |
|
dictionary["quit"] = operation{op: quit} |
|
dictionary["."] = operation{op: forth("10 base")} |
|
} |
|
|
|
func newop(st *[]int, stp *int, code []string) string { |
|
if len(code) > 0 { |
|
dictionary[code[0]] = operation{op: forth(strings.Join(code[1:], " "))} |
|
} |
|
return "" |
|
} |
|
|
|
func base(st *[]int, stp *int, _ []string) string { |
|
base, _ := getvalue(st, stp) |
|
r, err := getvalue(st, stp) |
|
if err != nil { |
|
return err.Error() |
|
} |
|
return strconv.FormatInt(int64(r), base) |
|
} |
|
|
|
func add(st *[]int, stp *int, _ []string) string { |
|
n1, _ := getvalue(st, stp) |
|
n2, err := getvalue(st, stp) |
|
if err != nil { |
|
return err.Error() |
|
} |
|
err = putvalue(st, stp, n1+n2) |
|
if err != nil { |
|
return err.Error() |
|
} |
|
return "*" |
|
} |
|
|
|
func quit(_ *[]int, _ *int, _ []string) string { |
|
os.Exit(0) |
|
return "should have quit" |
|
}
|
|
|