forge: method Const() for storing and retrieving constant values

This commit is contained in:
Helmut Merz 2023-07-28 09:45:51 +02:00
parent 0638d39bd2
commit 0bb39f022f
2 changed files with 14 additions and 7 deletions

View file

@ -42,6 +42,7 @@ func newFE(voc *fvoc) *forgeEnv {
var newVoc = voc.NewVoc[fitem] var newVoc = voc.NewVoc[fitem]
var newScalar = ptr.NewScalar[fitem]
var newPtr = ptr.NewSlice[fitem] var newPtr = ptr.NewSlice[fitem]
// xitem (executable item) / XT (execution token) // xitem (executable item) / XT (execution token)
@ -90,11 +91,18 @@ func (f *forgeEnv) Exec(items ...fitem) {
} }
func (f *forgeEnv) Def(name string, items ...fitem) XT { func (f *forgeEnv) Def(name string, items ...fitem) XT {
xt := Register(f.voc, name, callDef) xt := Register(f.voc, name, doDef)
xt.body = newPtr(f.Code(items...)).Next() xt.body = newPtr(f.Code(items...)).Next()
return xt return xt
} }
func (f *forgeEnv) Const(name string, value fitem) XT {
xt := Register(f.voc, name, doData)
xt.body = newScalar()
xt.body.Append(value)
return xt
}
func (f *forgeEnv) Literal() { func (f *forgeEnv) Literal() {
f.Push(f.ip.Next().Value()) f.Push(f.ip.Next().Value())
} }
@ -115,16 +123,12 @@ func (f *forgeEnv) Peek(d int) fitem {
return f.ds.Peek(d) return f.ds.Peek(d)
} }
func (f *forgeEnv) Const(name string) {
}
// basic functions for executable items // basic functions for executable items
func callDef(f *forgeEnv, xt XT) { func doDef(f *forgeEnv, xt XT) {
f.Call(xt.body.Value().(fptr)) f.Call(xt.body.Value().(fptr))
} }
func callData(f *forgeEnv, xt XT) { func doData(f *forgeEnv, xt XT) {
f.Push(xt.body.Value()) f.Push(xt.body.Value())
} }

View file

@ -22,4 +22,7 @@ func ExecTest(t *testing.T) {
sq := fe.Def("square", b.Dup, b.Mult) sq := fe.Def("square", b.Dup, b.Mult)
fe.Exec(b.Lit, 3, sq, b.Lit, 2, b.Add) fe.Exec(b.Lit, 3, sq, b.Lit, 2, b.Add)
t.AssertEqual(fe.Pop(), 11) t.AssertEqual(fe.Pop(), 11)
seven := fe.Const("seven", 7)
fe.Exec(b.Lit, 3, seven, sq, b.Add)
t.AssertEqual(fe.Pop(), 52)
} }