From 465cfe7aa90b06b972e8b8d6edc3197d2f3df61a Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Sat, 29 Jul 2023 18:18:33 +0200 Subject: [PATCH] forge: work in progress: code and data definitions --- forge/builtins/builtins.go | 2 +- forge/forge.go | 14 ++++++++------ tests/forge_test.go | 5 ++++- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/forge/builtins/builtins.go b/forge/builtins/builtins.go index ae29bb1..28769bb 100644 --- a/forge/builtins/builtins.go +++ b/forge/builtins/builtins.go @@ -30,7 +30,7 @@ func setup(f FE) *builtins { Dup: r("dup", func(f FE, _ XT) { f.Push(f.Peek(0)) }), Get: r("@", func(f FE, _ XT) { f.Push(f.Pop().(forge.FPtr).Value()) }), Here: r("here", func(f FE, _ XT) { f.Push(f.Here()) }), - Lit: r("literal", func(f FE, _ XT) { f.Literal() }), + Lit: r("literal", func(f FE, _ XT) { f.Push(f.Literal()) }), Mult: r("*", func(f FE, _ XT) { f.Push(f.Pop().(int) * f.Pop().(int)) }), New: r("new", func(f FE, _ XT) { f.New() }), Put: r("!", func(f FE, _ XT) { f.Pop().(forge.FPtr).Set(f.Pop()) }), diff --git a/forge/forge.go b/forge/forge.go index 250e2b0..68aa6b9 100644 --- a/forge/forge.go +++ b/forge/forge.go @@ -159,10 +159,6 @@ func (f *forgeEnv) Exec(items ...fitem) { f.Call(f.Code(items...)) } -func (f *forgeEnv) Literal() { - f.Push(f.ip.Next().Value()) -} - // definition methods, may become obsolete func (f *forgeEnv) Def(name string, items ...fitem) XT { @@ -182,14 +178,20 @@ func (f *forgeEnv) New() { f.cp = newPtr() } -func (f *forgeEnv) Compile(it fitem) { - f.cp.Append(it) +func (f *forgeEnv) Compile(its ...fitem) { + for _, it := range its { + f.cp.Append(it) + } } func (f *forgeEnv) Here() fptr { return f.cp.Clone() } +func (f *forgeEnv) Literal() fitem { + return f.ip.Next().Value() +} + func (f *forgeEnv) Voc() *fvoc { return f.voc } diff --git a/tests/forge_test.go b/tests/forge_test.go index 4f5ae64..39a2959 100644 --- a/tests/forge_test.go +++ b/tests/forge_test.go @@ -32,11 +32,14 @@ func ExecTest(t *testing.T) { func CoreTest(t *testing.T) { //sq := fe.Def("square", b.Dup, b.Mult) + //fe.Comp(b.Dup, b.Mult); fe.Exec(b.Lit, "square", b.def) fe.Exec(b.New, b.Here) fe.Exec(b.Lit, b.Dup, b.Comp, b.Lit, b.Mult, b.Comp, b.Lit, "square", b.Reg) sq := fe.Pop() + //seven := fe.Const("seven", 7) + //fe.Exec(b.Lit, 7, b.Lit, "seven", b.const) fe.Exec(b.New, b.Here) - fe.Exec(b.Lit, b.Lit, b.Comp, b.Lit, 7, b.Comp, b.Lit, "x", b.Reg) + fe.Exec(b.Lit, b.Lit, b.Comp, b.Lit, 7, b.Comp, b.Lit, "seven", b.Reg) seven := fe.Pop() fe.Exec(b.Lit, 3, seven, sq, b.Add) t.AssertEqual(fe.Pop(), 52)