put XT definitions in separate source file; get rid of 'name' type

This commit is contained in:
Helmut Merz 2023-08-04 09:20:57 +02:00
parent 86fe7ca04f
commit 0852ba19fd
4 changed files with 75 additions and 74 deletions

View file

@ -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
}

View file

@ -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 {

72
forge/xt.go Normal file
View file

@ -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)
}

View file

@ -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)