From 8e2796d531d2cdaa98025dd0f0e46637abb2d3a7 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Sat, 29 Jul 2023 09:35:19 +0200 Subject: [PATCH] use new XT implementations (GoFunc, FCode, Data) --- forge/builtins/builtins.go | 2 +- forge/forge.go | 71 +++++++++++++++++++++++--------------- 2 files changed, 45 insertions(+), 28 deletions(-) diff --git a/forge/builtins/builtins.go b/forge/builtins/builtins.go index 55ac854..3d7ae4a 100644 --- a/forge/builtins/builtins.go +++ b/forge/builtins/builtins.go @@ -22,7 +22,7 @@ func Get(f FE) *builtins { func setup(f FE) *builtins { voc := f.Voc() r := func(name string, fct forge.Callable) XT { - return forge.Register(voc, name, fct) + return forge.Register(voc, forge.GoFunc(name, fct)) } return &builtins{ Add: r("+", func(f FE, _ XT) { f.Push(f.Pop().(int) + f.Pop().(int)) }), diff --git a/forge/forge.go b/forge/forge.go index ff2b0ad..09bb76e 100644 --- a/forge/forge.go +++ b/forge/forge.go @@ -83,37 +83,57 @@ func (it *gofunc) Data() fptr { return nil } -// xitem: executable item with all parts +// fcode: with forge code -type xitem struct { +type fcode struct { + name + code fptr +} + +func FCode(n string, c fptr) XT { + return &fcode{name(n), c} +} + +func (it *fcode) Fct() Callable { + return doDef +} + +func (it *fcode) Code() fptr { + return it.code +} + +func (it *fcode) Data() fptr { + return nil +} + +// data: data provider, with optional forge code + +type data struct { name - fct Callable - body fptr code fptr data fptr } -func (it *xitem) Fct() Callable { - return it.fct +func Data(n string, d, c fptr) XT { + return &data{name(n), c, d} } -func (it *xitem) Code() fptr { - //return it.code - return it.body +func (it *data) Fct() Callable { + return doData } -func (it *xitem) Data() fptr { - //return it.data - return it.body +func (it *data) Code() fptr { + return it.code } -func Register(voc *fvoc, n string, fct Callable) *xitem { - it := xitem{ - name: name(n), - fct: fct, - } - voc.Register(n, &it) - return &it +func (it *data) Data() fptr { + return it.data +} + +// func Register(voc *fvoc, n string, fct Callable) *xitem { +func Register(voc *fvoc, it XT) XT { + voc.Register(it.Name(), it) + return it } // forgeEnv methods @@ -139,16 +159,13 @@ func (f *forgeEnv) Exec(items ...fitem) { } func (f *forgeEnv) Def(name string, items ...fitem) XT { - xt := Register(f.voc, name, doDef) - xt.body = newPtr(f.Code(items...)).Next() - return xt + code := f.Code(items...) + return Register(f.voc, FCode(name, code)) } func (f *forgeEnv) Const(name string, value fitem) XT { - xt := Register(f.voc, name, doData) - xt.body = newScalar() - xt.body.Append(value) - return xt + data := newScalar().Append(value) + return Register(f.voc, Data(name, data, nil)) } func (f *forgeEnv) Literal() { @@ -174,7 +191,7 @@ func (f *forgeEnv) Peek(d int) fitem { // basic functions for executable items func doDef(f *forgeEnv, xt XT) { - f.Call(xt.Code().Value().(fptr)) + f.Call(xt.Code().(fptr)) } func doData(f *forgeEnv, xt XT) {