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 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 {
@ -37,11 +38,11 @@ func setup(f FE) *builtins {
Body: r("body", func(f FE, _ XT) {
f.Push(f.Pop().(XT).Code().New().Next())
}),
Comp: r("comp", func(f FE, _ XT) { f.LatestXT().Code().Append(f.Pop()) }),
Create: r("create", create),
Dup: r("dup", func(f FE, _ XT) { f.Push(f.Peek(0)) }),
Get: r("@", func(f FE, _ XT) { f.Push(f.Pop().(FPtr).Value()) }),
Lit: r("lit", func(f FE, _ XT) { f.Push(f.Literal()) }),
Code: r("code", func(f FE, _ XT) { f.Push(f.Code()) }),
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)) }),
Get: r("@", func(f FE, _ XT) { f.Push(f.Pop().(FPtr).Value()) }),
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))
}),
@ -54,12 +55,11 @@ func setup(f FE) *builtins {
f.Push(a)
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",
//f.Code(b.Code, b.Swap, b.Reg, b.New1, b.Comp)))
rf := func(name string, code ...forge.FItem) XT {
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
}

View file

@ -112,5 +112,5 @@ func (f *forgeEnv) Register(xt XT) {
// basic functions for executable items
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)
t.AssertEqual(fe.Pop(), 52)
//myvar := fe.Exec(fe.Code(fe.NewVar()), "myvar", b.Reg).Pop()
dvar := fe.Exec(fe.Code(), "var", b.Create).LatestXT()
myvar := fe.Exec("myvar", dvar).LatestXT()
//myvar := fe.Exec("myvar", b.Var1).LatestXT()
myvar := fe.Exec("myvar", b.Var1).LatestXT()
fe.Exec(5, myvar, b.Put)
fe.Exec(seven, myvar, b.Get, b.Mult)
t.AssertEqual(fe.Pop(), 35)