diff --git a/forge/builtins/builtins.go b/forge/builtins/builtins.go index 3dbefe2..98ab0ab 100644 --- a/forge/builtins/builtins.go +++ b/forge/builtins/builtins.go @@ -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))) + })) } diff --git a/forge/forge.go b/forge/forge.go index c0ca465..a5499af 100644 --- a/forge/forge.go +++ b/forge/forge.go @@ -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) { diff --git a/tests/forge_test.go b/tests/forge_test.go index fc72a52..0979722 100644 --- a/tests/forge_test.go +++ b/tests/forge_test.go @@ -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)