package builtins import "git.sr.ht/~cco/go-scopes/forge" type FE = forge.FE type XT = forge.XT type builtins struct { Add, Dup, Lit, Mult 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, 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)) }), Lit: r("literal", func(f FE, _ XT) { f.Literal() }), Mult: r("*", func(f FE, _ XT) { f.Push(f.Pop().(int) * f.Pop().(int)) }), } }