From 0852ba19fdd73bf69c72f7c213f83737d9a63f3f Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Fri, 4 Aug 2023 09:20:57 +0200 Subject: [PATCH] put XT definitions in separate source file; get rid of 'name' type --- forge/builtins/builtins.go | 2 ++ forge/forge.go | 73 -------------------------------------- forge/xt.go | 72 +++++++++++++++++++++++++++++++++++++ tests/forge_test.go | 2 +- 4 files changed, 75 insertions(+), 74 deletions(-) create mode 100644 forge/xt.go diff --git a/forge/builtins/builtins.go b/forge/builtins/builtins.go index 98ab0ab..cb4e637 100644 --- a/forge/builtins/builtins.go +++ b/forge/builtins/builtins.go @@ -46,6 +46,8 @@ func setup(f FE) *builtins { 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))) return &b } diff --git a/forge/forge.go b/forge/forge.go index a5499af..e0ca86d 100644 --- a/forge/forge.go +++ b/forge/forge.go @@ -49,79 +49,6 @@ var newVoc = voc.NewVoc[fitem] var newScalar = ptr.NewScalar[fitem] var newPtr = ptr.NewSlice[fitem] -// XT (execution token) - -type XT interface { - Name() string - Fct() Callable - Code() fptr -} - -type name string - -func (n name) Name() string { - return string(n) -} - -func Register(voc *fvoc, it XT) XT { - voc.Register(it.Name(), it) - return it -} - -// gofunc: XT consisting only of a function written in Go - -type gofunc struct { - name - fct Callable -} - -func GoFunc(n string, fct Callable) XT { - return &gofunc{name(n), fct} -} - -func (it *gofunc) Fct() Callable { - return it.fct -} - -func (it *gofunc) Code() fptr { - return nil -} - -// acode (anonymous code), fcode: forge code - -type acode struct { - code fptr -} - -func AnonCode(c fptr) XT { - return &acode{c} -} - -func (it *acode) Name() string { - return "" -} - -func (it *acode) Fct() Callable { - return doFCode -} - -func (it *acode) Code() fptr { - return it.code -} - -type fcode struct { - name - acode -} - -func FCode(n string, c fptr) XT { - return &fcode{name(n), acode{c}} -} - -func (it *fcode) Name() string { - return string(it.name) -} - // forgeEnv methods func (f *forgeEnv) Code(items ...fitem) fptr { diff --git a/forge/xt.go b/forge/xt.go new file mode 100644 index 0000000..e854ea1 --- /dev/null +++ b/forge/xt.go @@ -0,0 +1,72 @@ +package forge + +// XT (execution token) + +type XT interface { + Name() string + Fct() Callable + Code() fptr +} + +func Register(voc *fvoc, it XT) XT { + voc.Register(it.Name(), it) + return it +} + +// gofunc: XT consisting only of a function written in Go + +type gofunc struct { + fct Callable + name string +} + +func GoFunc(n string, fct Callable) XT { + return &gofunc{fct, n} +} + +func (it *gofunc) Fct() Callable { + return it.fct +} + +func (it *gofunc) Code() fptr { + return nil +} + +func (it *gofunc) Name() string { + return string(it.name) +} + +// acode (anonymous code), fcode: forge code + +type acode struct { + code fptr +} + +func AnonCode(c fptr) XT { + return &acode{c} +} + +func (it *acode) Fct() Callable { + return doFCode +} + +func (it *acode) Code() fptr { + return it.code +} + +func (it *acode) Name() string { + return "" +} + +type fcode struct { + acode + name string +} + +func FCode(n string, c fptr) XT { + return &fcode{acode{c}, n} +} + +func (it *fcode) Name() string { + return string(it.name) +} diff --git a/tests/forge_test.go b/tests/forge_test.go index 0979722..6ed5e82 100644 --- a/tests/forge_test.go +++ b/tests/forge_test.go @@ -34,7 +34,7 @@ func CoreTest(t *testing.T) { //myvar := fe.Exec(fe.Code(fe.NewVar()), "myvar", b.Reg).Pop() dvar := fe.Exec(fe.Code(), "var", b.Create).LatestXT() myvar := fe.Exec("myvar", dvar).LatestXT() - //myvar := fe.Exec("myvar", b.Var).Pop() + //myvar := fe.Exec("myvar", b.Var1).LatestXT() fe.Exec(5, myvar, b.Put) fe.Exec(seven, myvar, b.Get, b.Mult) t.AssertEqual(fe.Pop(), 35)