use new XT implementations (GoFunc, FCode, Data)

This commit is contained in:
Helmut Merz 2023-07-29 09:35:19 +02:00
parent d0235d0ffe
commit 8e2796d531
2 changed files with 45 additions and 28 deletions

View file

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

View file

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