put XT definitions in separate source file; get rid of 'name' type
This commit is contained in:
parent
86fe7ca04f
commit
0852ba19fd
4 changed files with 75 additions and 74 deletions
|
@ -46,6 +46,8 @@ func setup(f FE) *builtins {
|
||||||
f.Register(forge.FCode(f.Pop().(string), f.Code(f.NewVar())))
|
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
|
return &b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -49,79 +49,6 @@ var newVoc = voc.NewVoc[fitem]
|
||||||
var newScalar = ptr.NewScalar[fitem]
|
var newScalar = ptr.NewScalar[fitem]
|
||||||
var newPtr = ptr.NewSlice[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
|
// forgeEnv methods
|
||||||
|
|
||||||
func (f *forgeEnv) Code(items ...fitem) fptr {
|
func (f *forgeEnv) Code(items ...fitem) fptr {
|
||||||
|
|
72
forge/xt.go
Normal file
72
forge/xt.go
Normal 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)
|
||||||
|
}
|
|
@ -34,7 +34,7 @@ func CoreTest(t *testing.T) {
|
||||||
//myvar := fe.Exec(fe.Code(fe.NewVar()), "myvar", b.Reg).Pop()
|
//myvar := fe.Exec(fe.Code(fe.NewVar()), "myvar", b.Reg).Pop()
|
||||||
dvar := fe.Exec(fe.Code(), "var", b.Create).LatestXT()
|
dvar := fe.Exec(fe.Code(), "var", b.Create).LatestXT()
|
||||||
myvar := fe.Exec("myvar", dvar).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(5, myvar, b.Put)
|
||||||
fe.Exec(seven, myvar, b.Get, b.Mult)
|
fe.Exec(seven, myvar, b.Get, b.Mult)
|
||||||
t.AssertEqual(fe.Pop(), 35)
|
t.AssertEqual(fe.Pop(), 35)
|
||||||
|
|
Loading…
Add table
Reference in a new issue