forge: create scalar variable with 'var1' - defined as forge code

This commit is contained in:
Helmut Merz 2023-08-05 16:53:26 +02:00
parent 98231b070b
commit 0027b21a44
3 changed files with 13 additions and 15 deletions

View file

@ -9,7 +9,8 @@ type XT = forge.XT
type FPtr = forge.FPtr type FPtr = forge.FPtr
type builtins struct { type builtins struct {
Add, Body, Comp, Create, Dup, Get, Lit, Mult, New1, Put, Reg, Swap, Var XT Add, Body, Code, Comp, Dup, Get, Lit, Mult, New1, Put, Reg, Swap XT
Var1 XT
} }
func Get(f FE) *builtins { func Get(f FE) *builtins {
@ -37,11 +38,11 @@ func setup(f FE) *builtins {
Body: r("body", func(f FE, _ XT) { Body: r("body", func(f FE, _ XT) {
f.Push(f.Pop().(XT).Code().New().Next()) f.Push(f.Pop().(XT).Code().New().Next())
}), }),
Comp: r("comp", func(f FE, _ XT) { f.LatestXT().Code().Append(f.Pop()) }), Code: r("code", func(f FE, _ XT) { f.Push(f.Code()) }),
Create: r("create", create), Comp: r("comp", func(f FE, _ XT) { f.LatestXT().Code().Append(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().(FPtr).Value()) }), Get: r("@", func(f FE, _ XT) { f.Push(f.Pop().(FPtr).Value()) }),
Lit: r("lit", 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) { Mult: r("*", func(f FE, _ XT) {
f.Push(f.Pop().(int) * f.Pop().(int)) f.Push(f.Pop().(int) * f.Pop().(int))
}), }),
@ -54,12 +55,11 @@ func setup(f FE) *builtins {
f.Push(a) f.Push(a)
f.Push(b) f.Push(b)
}), }),
Var: r("var", func(f FE, _ XT) {
f.Register(forge.FCode(f.Pop().(string), f.Code(f.NewVar())))
}),
} }
// b.Var1 = forge.Register(voc, forge.FCode("var1", rf := func(name string, code ...forge.FItem) XT {
//f.Code(b.Code, b.Swap, b.Reg, b.New1, b.Comp))) return forge.Register(voc, forge.FCode(name, f.Code(code...)))
}
b.Var1 = rf("var1", b.Code, b.Swap, b.Reg, b.New1, b.Comp)
return &b return &b
} }

View file

@ -112,5 +112,5 @@ func (f *forgeEnv) Register(xt XT) {
// basic functions for executable items // basic functions for executable items
func doFCode(f *forgeEnv, xt XT) { func doFCode(f *forgeEnv, xt XT) {
f.Call(xt.Code()) f.Call(xt.Code().New())
} }

View file

@ -32,9 +32,7 @@ func CoreTest(t *testing.T) {
fe.Exec(3, seven, sq, b.Add) fe.Exec(3, seven, sq, b.Add)
t.AssertEqual(fe.Pop(), 52) t.AssertEqual(fe.Pop(), 52)
//myvar := fe.Exec(fe.Code(fe.NewVar()), "myvar", b.Reg).Pop() //myvar := fe.Exec(fe.Code(fe.NewVar()), "myvar", b.Reg).Pop()
dvar := fe.Exec(fe.Code(), "var", b.Create).LatestXT() myvar := fe.Exec("myvar", b.Var1).LatestXT()
myvar := fe.Exec("myvar", dvar).LatestXT()
//myvar := fe.Exec("myvar", b.Var1).LatestXT()
fe.Exec(5, myvar, b.Put) fe.Exec(5, myvar, b.Put)
fe.Exec(seven, myvar, b.Get, b.Mult) fe.Exec(seven, myvar, b.Get, b.Mult)
t.AssertEqual(fe.Pop(), 35) t.AssertEqual(fe.Pop(), 35)