forge: refactorings of register functionality
This commit is contained in:
parent
aa953a7b10
commit
86fe7ca04f
3 changed files with 29 additions and 21 deletions
|
@ -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))))
|
|
||||||
})))
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,7 @@ type Callable func(*forgeEnv, XT)
|
||||||
type forgeEnv struct {
|
type forgeEnv struct {
|
||||||
ds, rs fstack
|
ds, rs fstack
|
||||||
ip fptr
|
ip fptr
|
||||||
|
latestxt XT
|
||||||
voc *fvoc
|
voc *fvoc
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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) {
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Add table
Reference in a new issue