forge: refactorings of register functionality

This commit is contained in:
Helmut Merz 2023-08-03 09:40:57 +02:00
parent aa953a7b10
commit 86fe7ca04f
3 changed files with 29 additions and 21 deletions

View file

@ -1,6 +1,8 @@
package builtins
import "git.sr.ht/~cco/go-scopes/forge"
import (
"git.sr.ht/~cco/go-scopes/forge"
)
type FE = forge.FE
type XT = forge.XT
@ -39,27 +41,23 @@ func setup(f FE) *builtins {
f.Push(f.Pop().(int) * f.Pop().(int))
}),
Put: r("!", func(f FE, _ XT) { f.Pop().(FPtr).Set(f.Pop()) }),
Reg: r("reg", reg),
Reg: r("reg", func(f FE, _ XT) { reg(f) }),
Var: r("var", func(f FE, _ XT) {
f.Push(forge.Register(voc,
forge.FCode(f.Pop().(string), f.Code(f.NewVar()))))
f.Register(forge.FCode(f.Pop().(string), f.Code(f.NewVar())))
}),
}
return &b
}
func reg(f FE, _ XT) {
f.Push(forge.Register(f.Voc(),
forge.FCode(f.Pop().(string), f.Pop().(FPtr))))
func reg(f FE) {
f.Register(forge.FCode(f.Pop().(string), f.Pop().(FPtr)))
}
func create(f FE, xt XT) {
func create(f FE, _ XT) {
name := f.Pop().(string)
does := forge.AnonCode(f.Pop().(FPtr))
f.Push(forge.Register(f.Voc(),
forge.GoFunc(name, func(f FE, xt XT) {
f.Push(forge.Register(f.Voc(),
forge.FCode(f.Pop().(string),
f.Code(f.NewVar(), does))))
})))
f.Register(forge.GoFunc(name, func(f FE, _ XT) {
f.Register(forge.FCode(f.Pop().(string),
f.Code(f.NewVar(), does)))
}))
}

View file

@ -19,9 +19,10 @@ type fvoc = voc.Vocabulary[fitem]
type Callable func(*forgeEnv, XT)
type forgeEnv struct {
ds, rs fstack
ip fptr
voc *fvoc
ds, rs fstack
ip fptr
latestxt XT
voc *fvoc
}
type FE = *forgeEnv
@ -174,6 +175,15 @@ func (f *forgeEnv) Peek(d int) fitem {
return f.ds.Peek(d)
}
func (f *forgeEnv) LatestXT() XT {
return f.latestxt
}
func (f *forgeEnv) Register(xt XT) {
Register(f.Voc(), xt)
f.latestxt = xt
}
// basic functions for executable items
func doFCode(f *forgeEnv, xt XT) {

View file

@ -27,13 +27,13 @@ func ExecTest(t *testing.T) {
}
func CoreTest(t *testing.T) {
sq := fe.Exec(fe.Code(b.Dup, b.Mult), "square", b.Reg).Pop()
seven := fe.Exec(fe.Code(7), "seven", b.Reg).Pop()
sq := fe.Exec(fe.Code(b.Dup, b.Mult), "square", b.Reg).LatestXT()
seven := fe.Exec(fe.Code(7), "seven", b.Reg).LatestXT()
fe.Exec(3, seven, sq, b.Add)
t.AssertEqual(fe.Pop(), 52)
//myvar := fe.Exec(fe.Code(fe.NewVar()), "myvar", b.Reg).Pop()
dvar := fe.Exec(fe.Code(), "var", b.Create).Pop()
myvar := fe.Exec("myvar", dvar).Pop()
dvar := fe.Exec(fe.Code(), "var", b.Create).LatestXT()
myvar := fe.Exec("myvar", dvar).LatestXT()
//myvar := fe.Exec("myvar", b.Var).Pop()
fe.Exec(5, myvar, b.Put)
fe.Exec(seven, myvar, b.Get, b.Mult)