get rid of 'data' XT implementation + more simplifications

This commit is contained in:
Helmut Merz 2023-07-30 09:56:27 +02:00
parent a8e32f86e8
commit 025ac92c6f
3 changed files with 17 additions and 78 deletions

View file

@ -28,7 +28,7 @@ func setup(f FE) *builtins {
Add: r("+", func(f FE, _ XT) { f.Push(f.Pop().(int) + f.Pop().(int)) }),
Dup: r("dup", func(f FE, _ XT) { f.Push(f.Peek(0)) }),
Get: r("@", func(f FE, _ XT) { f.Push(f.Pop().(forge.FPtr).Value()) }),
Lit: r("literal", func(f FE, _ XT) { f.Push(f.Literal()) }),
Lit: r("lit", func(f FE, _ XT) { f.Push(f.Literal()) }),
Mult: r("*", func(f FE, _ XT) { f.Push(f.Pop().(int) * f.Pop().(int)) }),
Put: r("!", func(f FE, _ XT) { f.Pop().(forge.FPtr).Set(f.Pop()) }),
Reg: r("reg", func(f FE, _ XT) {

View file

@ -53,7 +53,6 @@ type XT interface {
Name() string
Fct() Callable
Code() fptr
Data() fptr
}
type name string
@ -86,10 +85,6 @@ func (it *gofunc) Code() fptr {
return nil
}
func (it *gofunc) Data() fptr {
return nil
}
// fcode: with forge code
type fcode struct {
@ -109,34 +104,6 @@ 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
code fptr
data fptr
}
func Data(n string, d, c fptr) XT {
return &data{name(n), c, d}
}
func (it *data) Fct() Callable {
return doData
}
func (it *data) Code() fptr {
return it.code
}
func (it *data) Data() fptr {
return it.data
}
// forgeEnv methods
func (f *forgeEnv) Code(items ...fitem) fptr {
@ -145,31 +112,23 @@ func (f *forgeEnv) Code(items ...fitem) fptr {
return code
}
func (f *forgeEnv) Call(code fptr) {
func (f *forgeEnv) Call(code fptr) *forgeEnv {
f.rs.Push(f.ip)
f.ip = code.Clone()
for f.ip.Next() != nil {
xt := f.ip.Value().(XT)
xt.Fct()(f, xt)
value := f.ip.Value()
if xt, ok := value.(XT); ok {
xt.Fct()(f, xt)
} else {
f.Push(value)
}
}
f.ip = f.rs.Pop().(fptr)
return f
}
func (f *forgeEnv) Exec(items ...fitem) {
f.Call(f.Code(items...))
}
// definition methods, may become obsolete
func (f *forgeEnv) Def(name string, items ...fitem) XT {
code := f.Code(items...)
return Register(f.voc, FCode(name, code))
}
func (f *forgeEnv) Create(name string, value fitem, code fptr) XT {
data := newScalar().Set(value)
//return Register(f.voc, FCode(name, f.Code(b.Lit, data, code))
return Register(f.voc, Data(name, data, code))
func (f *forgeEnv) Exec(items ...fitem) *forgeEnv {
return f.Call(f.Code(items...))
}
// core methods
@ -203,11 +162,3 @@ func (f *forgeEnv) Peek(d int) fitem {
func doFCode(f *forgeEnv, xt XT) {
f.Call(xt.Code())
}
func doData(f *forgeEnv, xt XT) {
f.Push(xt.Data())
code := xt.Code()
if code != nil {
f.Call(code)
}
}

View file

@ -18,30 +18,18 @@ func TestForge(tb *tbase.T) {
}
func ExecTest(t *testing.T) {
c1 := fe.Code(b.Lit, 4, b.Lit, 2, b.Add)
c1 := fe.Code(4, 2, b.Add)
fe.Call(c1)
t.AssertEqual(fe.Pop(), 6)
sq := fe.Def("square", b.Dup, b.Mult)
fe.Exec(b.Lit, 3, sq, b.Lit, 2, b.Add)
t.AssertEqual(fe.Pop(), 11)
seven := fe.Create("seven", 7, fe.Code(b.Get))
fe.Exec(b.Lit, 3, seven, sq, b.Add)
t.AssertEqual(fe.Pop(), 52)
}
func CoreTest(t *testing.T) {
fe.Push(fe.Code(b.Dup, b.Mult))
fe.Exec(b.Lit, "square", b.Reg)
sq := fe.Pop()
fe.Push(fe.Code(b.Lit, 7))
fe.Exec(b.Lit, "seven", b.Reg)
seven := fe.Pop()
fe.Exec(b.Lit, 3, seven, sq, b.Add)
sq := fe.Exec(fe.Code(b.Dup, b.Mult), "square", b.Reg).Pop()
seven := fe.Exec(fe.Code(7), "seven", b.Reg).Pop()
fe.Exec(3, seven, sq, b.Add)
t.AssertEqual(fe.Pop(), 52)
fe.Push(fe.Code(b.Lit, fe.NewVar()))
fe.Exec(b.Lit, "myvar", b.Reg)
myvar := fe.Pop()
fe.Exec(b.Lit, 5, myvar, b.Put)
myvar := fe.Exec(fe.Code(fe.NewVar()), "myvar", b.Reg).Pop()
fe.Exec(5, myvar, b.Put)
fe.Exec(seven, myvar, b.Get, b.Mult)
t.AssertEqual(fe.Pop(), 35)
}