From 98231b070b34fd85309a77e9fdce85e2032cae66 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Fri, 4 Aug 2023 22:42:22 +0200 Subject: [PATCH] more built-ins for code creation --- forge/builtins/builtins.go | 22 +++++++++++++++++----- forge/forge.go | 2 -- forge/xt.go | 4 +++- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/forge/builtins/builtins.go b/forge/builtins/builtins.go index cb4e637..0fe4d06 100644 --- a/forge/builtins/builtins.go +++ b/forge/builtins/builtins.go @@ -9,7 +9,7 @@ type XT = forge.XT type FPtr = forge.FPtr type builtins struct { - Add, Body, Create, Dup, Get, Lit, Mult, Put, Reg, Var XT + Add, Body, Comp, Create, Dup, Get, Lit, Mult, New1, Put, Reg, Swap, Var XT } func Get(f FE) *builtins { @@ -30,9 +30,14 @@ func setup(f FE) *builtins { Add: r("+", func(f FE, _ XT) { f.Push(f.Pop().(int) + f.Pop().(int)) }), + /*Append: r("append", func(f FE, _ XT) { + item := f.Pop() + f.Peek(0).(FPtr).Append(item) + }),*/ Body: r("body", func(f FE, _ XT) { f.Push(f.Pop().(XT).Code().New().Next()) }), + Comp: r("comp", func(f FE, _ XT) { f.LatestXT().Code().Append(f.Pop()) }), Create: r("create", create), Dup: r("dup", func(f FE, _ XT) { f.Push(f.Peek(0)) }), Get: r("@", func(f FE, _ XT) { f.Push(f.Pop().(FPtr).Value()) }), @@ -40,19 +45,26 @@ func setup(f FE) *builtins { Mult: r("*", func(f FE, _ XT) { f.Push(f.Pop().(int) * f.Pop().(int)) }), - Put: r("!", func(f FE, _ XT) { f.Pop().(FPtr).Set(f.Pop()) }), - Reg: r("reg", func(f FE, _ XT) { reg(f) }), + New1: r("new1", func(f FE, _ XT) { f.Push(f.NewVar()) }), + Put: r("!", func(f FE, _ XT) { f.Pop().(FPtr).Set(f.Pop()) }), + Reg: r("reg", func(f FE, _ XT) { reg(f) }), + Swap: r("swap", func(f FE, _ XT) { + a := f.Pop() + b := f.Pop() + f.Push(a) + f.Push(b) + }), Var: r("var", func(f FE, _ XT) { f.Register(forge.FCode(f.Pop().(string), f.Code(f.NewVar()))) }), } // b.Var1 = forge.Register(voc, forge.FCode("var1", - //f.Code(f.Code(b.New1), b.Swap, b.Reg))) + //f.Code(b.Code, b.Swap, b.Reg, b.New1, b.Comp))) return &b } func reg(f FE) { - f.Register(forge.FCode(f.Pop().(string), f.Pop().(FPtr))) + f.Register(forge.FCode(f.Pop().(string), f.Pop().(FPtr).Reset())) } func create(f FE, _ XT) { diff --git a/forge/forge.go b/forge/forge.go index e0ca86d..bc1c8ae 100644 --- a/forge/forge.go +++ b/forge/forge.go @@ -76,8 +76,6 @@ func (f *forgeEnv) Exec(items ...fitem) *forgeEnv { return f.Call(f.Code(items...)) } -// core methods - func (f *forgeEnv) NewVar() fptr { return newScalar() } diff --git a/forge/xt.go b/forge/xt.go index e854ea1..5b1190b 100644 --- a/forge/xt.go +++ b/forge/xt.go @@ -36,7 +36,7 @@ func (it *gofunc) Name() string { return string(it.name) } -// acode (anonymous code), fcode: forge code +// acode: anonymous forge code type acode struct { code fptr @@ -58,6 +58,8 @@ func (it *acode) Name() string { return "" } +// fcode: named (and usually registered) forge code + type fcode struct { acode name string