forge: code and data definitions: simplifications, provide explicit (test) code for variable definition
This commit is contained in:
parent
465cfe7aa9
commit
a8e32f86e8
3 changed files with 13 additions and 25 deletions
|
@ -6,7 +6,7 @@ type FE = forge.FE
|
||||||
type XT = forge.XT
|
type XT = forge.XT
|
||||||
|
|
||||||
type builtins struct {
|
type builtins struct {
|
||||||
Add, Comp, Dup, Get, Here, Lit, Mult, New, Put, Reg XT
|
Add, Dup, Get, Lit, Mult, Put, Reg XT
|
||||||
}
|
}
|
||||||
|
|
||||||
func Get(f FE) *builtins {
|
func Get(f FE) *builtins {
|
||||||
|
@ -26,13 +26,10 @@ func setup(f FE) *builtins {
|
||||||
}
|
}
|
||||||
b := builtins{
|
b := builtins{
|
||||||
Add: r("+", func(f FE, _ XT) { f.Push(f.Pop().(int) + f.Pop().(int)) }),
|
Add: r("+", func(f FE, _ XT) { f.Push(f.Pop().(int) + f.Pop().(int)) }),
|
||||||
Comp: r("comp", func(f FE, _ XT) { f.Compile(f.Pop()) }),
|
|
||||||
Dup: r("dup", func(f FE, _ XT) { f.Push(f.Peek(0)) }),
|
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()) }),
|
Get: r("@", func(f FE, _ XT) { f.Push(f.Pop().(forge.FPtr).Value()) }),
|
||||||
Here: r("here", func(f FE, _ XT) { f.Push(f.Here()) }),
|
|
||||||
Lit: r("literal", func(f FE, _ XT) { f.Push(f.Literal()) }),
|
Lit: r("literal", func(f FE, _ XT) { f.Push(f.Literal()) }),
|
||||||
Mult: r("*", func(f FE, _ XT) { f.Push(f.Pop().(int) * f.Pop().(int)) }),
|
Mult: r("*", func(f FE, _ XT) { f.Push(f.Pop().(int) * f.Pop().(int)) }),
|
||||||
New: r("new", func(f FE, _ XT) { f.New() }),
|
|
||||||
Put: r("!", func(f FE, _ XT) { f.Pop().(forge.FPtr).Set(f.Pop()) }),
|
Put: r("!", func(f FE, _ XT) { f.Pop().(forge.FPtr).Set(f.Pop()) }),
|
||||||
Reg: r("reg", func(f FE, _ XT) {
|
Reg: r("reg", func(f FE, _ XT) {
|
||||||
f.Push(forge.Register(voc,
|
f.Push(forge.Register(voc,
|
||||||
|
|
|
@ -174,18 +174,8 @@ func (f *forgeEnv) Create(name string, value fitem, code fptr) XT {
|
||||||
|
|
||||||
// core methods
|
// core methods
|
||||||
|
|
||||||
func (f *forgeEnv) New() {
|
func (f *forgeEnv) NewVar() fptr {
|
||||||
f.cp = newPtr()
|
return newScalar()
|
||||||
}
|
|
||||||
|
|
||||||
func (f *forgeEnv) Compile(its ...fitem) {
|
|
||||||
for _, it := range its {
|
|
||||||
f.cp.Append(it)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *forgeEnv) Here() fptr {
|
|
||||||
return f.cp.Clone()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *forgeEnv) Literal() fitem {
|
func (f *forgeEnv) Literal() fitem {
|
||||||
|
|
|
@ -25,22 +25,23 @@ func ExecTest(t *testing.T) {
|
||||||
fe.Exec(b.Lit, 3, sq, b.Lit, 2, b.Add)
|
fe.Exec(b.Lit, 3, sq, b.Lit, 2, b.Add)
|
||||||
t.AssertEqual(fe.Pop(), 11)
|
t.AssertEqual(fe.Pop(), 11)
|
||||||
seven := fe.Create("seven", 7, fe.Code(b.Get))
|
seven := fe.Create("seven", 7, fe.Code(b.Get))
|
||||||
//fe.Exec(b.Lit, 7, seven, b.Put)
|
|
||||||
fe.Exec(b.Lit, 3, seven, sq, b.Add)
|
fe.Exec(b.Lit, 3, seven, sq, b.Add)
|
||||||
t.AssertEqual(fe.Pop(), 52)
|
t.AssertEqual(fe.Pop(), 52)
|
||||||
}
|
}
|
||||||
|
|
||||||
func CoreTest(t *testing.T) {
|
func CoreTest(t *testing.T) {
|
||||||
//sq := fe.Def("square", b.Dup, b.Mult)
|
fe.Push(fe.Code(b.Dup, b.Mult))
|
||||||
//fe.Comp(b.Dup, b.Mult); fe.Exec(b.Lit, "square", b.def)
|
fe.Exec(b.Lit, "square", b.Reg)
|
||||||
fe.Exec(b.New, b.Here)
|
|
||||||
fe.Exec(b.Lit, b.Dup, b.Comp, b.Lit, b.Mult, b.Comp, b.Lit, "square", b.Reg)
|
|
||||||
sq := fe.Pop()
|
sq := fe.Pop()
|
||||||
//seven := fe.Const("seven", 7)
|
fe.Push(fe.Code(b.Lit, 7))
|
||||||
//fe.Exec(b.Lit, 7, b.Lit, "seven", b.const)
|
fe.Exec(b.Lit, "seven", b.Reg)
|
||||||
fe.Exec(b.New, b.Here)
|
|
||||||
fe.Exec(b.Lit, b.Lit, b.Comp, b.Lit, 7, b.Comp, b.Lit, "seven", b.Reg)
|
|
||||||
seven := fe.Pop()
|
seven := fe.Pop()
|
||||||
fe.Exec(b.Lit, 3, seven, sq, b.Add)
|
fe.Exec(b.Lit, 3, seven, sq, b.Add)
|
||||||
t.AssertEqual(fe.Pop(), 52)
|
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)
|
||||||
|
fe.Exec(seven, myvar, b.Get, b.Mult)
|
||||||
|
t.AssertEqual(fe.Pop(), 35)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue