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 package builtins
import "git.sr.ht/~cco/go-scopes/forge" import (
"git.sr.ht/~cco/go-scopes/forge"
)
type FE = forge.FE type FE = forge.FE
type XT = forge.XT type XT = forge.XT
@ -39,27 +41,23 @@ func setup(f FE) *builtins {
f.Push(f.Pop().(int) * f.Pop().(int)) f.Push(f.Pop().(int) * f.Pop().(int))
}), }),
Put: r("!", func(f FE, _ XT) { f.Pop().(FPtr).Set(f.Pop()) }), 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) { Var: r("var", func(f FE, _ XT) {
f.Push(forge.Register(voc, f.Register(forge.FCode(f.Pop().(string), f.Code(f.NewVar())))
forge.FCode(f.Pop().(string), f.Code(f.NewVar()))))
}), }),
} }
return &b return &b
} }
func reg(f FE, _ XT) { func reg(f FE) {
f.Push(forge.Register(f.Voc(), f.Register(forge.FCode(f.Pop().(string), f.Pop().(FPtr)))
forge.FCode(f.Pop().(string), f.Pop().(FPtr))))
} }
func create(f FE, xt XT) { func create(f FE, _ XT) {
name := f.Pop().(string) name := f.Pop().(string)
does := forge.AnonCode(f.Pop().(FPtr)) does := forge.AnonCode(f.Pop().(FPtr))
f.Push(forge.Register(f.Voc(), f.Register(forge.GoFunc(name, func(f FE, _ XT) {
forge.GoFunc(name, func(f FE, xt XT) { f.Register(forge.FCode(f.Pop().(string),
f.Push(forge.Register(f.Voc(), f.Code(f.NewVar(), does)))
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 Callable func(*forgeEnv, XT)
type forgeEnv struct { type forgeEnv struct {
ds, rs fstack ds, rs fstack
ip fptr ip fptr
voc *fvoc latestxt XT
voc *fvoc
} }
type FE = *forgeEnv type FE = *forgeEnv
@ -174,6 +175,15 @@ func (f *forgeEnv) Peek(d int) fitem {
return f.ds.Peek(d) 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 // basic functions for executable items
func doFCode(f *forgeEnv, xt XT) { func doFCode(f *forgeEnv, xt XT) {

View file

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