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
|
||||
|
||||
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)))
|
||||
}))
|
||||
}
|
||||
|
|
|
@ -21,6 +21,7 @@ type Callable func(*forgeEnv, XT)
|
|||
type forgeEnv struct {
|
||||
ds, rs fstack
|
||||
ip fptr
|
||||
latestxt XT
|
||||
voc *fvoc
|
||||
}
|
||||
|
||||
|
@ -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) {
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Reference in a new issue