From 0bb39f022fc70be8c041644d48918d571d359628 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Fri, 28 Jul 2023 09:45:51 +0200 Subject: [PATCH] forge: method Const() for storing and retrieving constant values --- forge/forge.go | 18 +++++++++++------- tests/forge_test.go | 3 +++ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/forge/forge.go b/forge/forge.go index 0c955fb..44ebcaa 100644 --- a/forge/forge.go +++ b/forge/forge.go @@ -42,6 +42,7 @@ func newFE(voc *fvoc) *forgeEnv { var newVoc = voc.NewVoc[fitem] +var newScalar = ptr.NewScalar[fitem] var newPtr = ptr.NewSlice[fitem] // 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 { - xt := Register(f.voc, name, callDef) + xt := Register(f.voc, name, doDef) xt.body = newPtr(f.Code(items...)).Next() 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() { f.Push(f.ip.Next().Value()) } @@ -115,16 +123,12 @@ func (f *forgeEnv) Peek(d int) fitem { return f.ds.Peek(d) } -func (f *forgeEnv) Const(name string) { -} - // basic functions for executable items -func callDef(f *forgeEnv, xt XT) { +func doDef(f *forgeEnv, xt XT) { f.Call(xt.body.Value().(fptr)) } -func callData(f *forgeEnv, xt XT) { +func doData(f *forgeEnv, xt XT) { f.Push(xt.body.Value()) } - diff --git a/tests/forge_test.go b/tests/forge_test.go index c70d854..7a2023d 100644 --- a/tests/forge_test.go +++ b/tests/forge_test.go @@ -22,4 +22,7 @@ func ExecTest(t *testing.T) { sq := fe.Def("square", b.Dup, b.Mult) fe.Exec(b.Lit, 3, sq, b.Lit, 2, b.Add) t.AssertEqual(fe.Pop(), 11) + seven := fe.Const("seven", 7) + fe.Exec(b.Lit, 3, seven, sq, b.Add) + t.AssertEqual(fe.Pop(), 52) }