use new XT implementations (GoFunc, FCode, Data)
This commit is contained in:
parent
d0235d0ffe
commit
8e2796d531
2 changed files with 45 additions and 28 deletions
|
@ -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)) }),
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Add table
Reference in a new issue