43 lines
1.2 KiB
Go
43 lines
1.2 KiB
Go
package builtins
|
|
|
|
import "git.sr.ht/~cco/go-scopes/forge"
|
|
|
|
type FE = forge.FE
|
|
type XT = forge.XT
|
|
|
|
type builtins struct {
|
|
Add, Comp, Dup, Get, Here, Lit, Mult, New, Put, Reg 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))
|
|
}
|
|
b := builtins{
|
|
Add: r("+", func(f FE, _ XT) { f.Push(f.Pop().(int) + f.Pop().(int)) }),
|
|
Comp: r("comp", func(f FE, _ XT) { f.Compile(f.Pop()) }),
|
|
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()) }),
|
|
Here: r("here", func(f FE, _ XT) { f.Push(f.Here()) }),
|
|
Lit: r("literal", func(f FE, _ XT) { f.Push(f.Literal()) }),
|
|
Mult: r("*", func(f FE, _ XT) { f.Push(f.Pop().(int) * f.Pop().(int)) }),
|
|
New: r("new", func(f FE, _ XT) { f.New() }),
|
|
Put: r("!", func(f FE, _ XT) { f.Pop().(forge.FPtr).Set(f.Pop()) }),
|
|
Reg: r("reg", func(f FE, _ XT) {
|
|
f.Push(forge.Register(voc,
|
|
forge.FCode(f.Pop().(string), f.Pop().(forge.FPtr))))
|
|
}),
|
|
}
|
|
return &b
|
|
}
|