diff --git a/forge/builtins/builtins.go b/forge/builtins/builtins.go index a752388..8f36b64 100644 --- a/forge/builtins/builtins.go +++ b/forge/builtins/builtins.go @@ -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) { diff --git a/forge/forge.go b/forge/forge.go index c23ba17..d2d5897 100644 --- a/forge/forge.go +++ b/forge/forge.go @@ -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) - } -} diff --git a/tests/forge_test.go b/tests/forge_test.go index d71fb2f..0d5ab2b 100644 --- a/tests/forge_test.go +++ b/tests/forge_test.go @@ -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) }