get rid of 'data' XT implementation + more simplifications
This commit is contained in:
parent
a8e32f86e8
commit
025ac92c6f
3 changed files with 17 additions and 78 deletions
|
@ -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) {
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue