go-scopes/forge/builtins/builtins.go

35 lines
923 B
Go

package builtins
import "git.sr.ht/~cco/go-scopes/forge"
type FE = forge.FE
type XT = forge.XT
type builtins struct {
Add, Dup, Get, Lit, Mult, Put XT
}
func Get(f FE) *builtins {
m := f.Voc().Lookup("builtins")
if m.IsNothing() {
b := setup(f)
f.Voc().Register("builtins", b)
return b
}
return m.Value().(*builtins)
}
func setup(f FE) *builtins {
voc := f.Voc()
r := func(name string, fct forge.Callable) XT {
return forge.Register(voc, forge.GoFunc(name, fct))
}
return &builtins{
Add: r("+", func(f FE, _ XT) { f.Push(f.Pop().(int) + f.Pop().(int)) }),
Dup: r("dup", func(f FE, _ XT) { f.Push(f.Peek(0)) }),
Get: r("@", func(f FE, _ XT) { f.Push(f.Pop().(forge.FPtr).Value()) }),
Lit: r("literal", func(f FE, _ XT) { f.Literal() }),
Mult: r("*", func(f FE, _ XT) { f.Push(f.Pop().(int) * f.Pop().(int)) }),
Put: r("!", func(f FE, _ XT) { f.Pop().(forge.FPtr).Set(f.Pop()) }),
}
}