more built-ins for code creation

This commit is contained in:
Helmut Merz 2023-08-04 22:42:22 +02:00
parent 0852ba19fd
commit 98231b070b
3 changed files with 20 additions and 8 deletions

View file

@ -9,7 +9,7 @@ type XT = forge.XT
type FPtr = forge.FPtr type FPtr = forge.FPtr
type builtins struct { type builtins struct {
Add, Body, Create, Dup, Get, Lit, Mult, Put, Reg, Var XT Add, Body, Comp, Create, Dup, Get, Lit, Mult, New1, Put, Reg, Swap, Var XT
} }
func Get(f FE) *builtins { func Get(f FE) *builtins {
@ -30,9 +30,14 @@ func setup(f FE) *builtins {
Add: r("+", func(f FE, _ XT) { Add: r("+", func(f FE, _ XT) {
f.Push(f.Pop().(int) + f.Pop().(int)) f.Push(f.Pop().(int) + f.Pop().(int))
}), }),
/*Append: r("append", func(f FE, _ XT) {
item := f.Pop()
f.Peek(0).(FPtr).Append(item)
}),*/
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()) }),
Create: r("create", create), Create: r("create", create),
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()) }),
@ -40,19 +45,26 @@ func setup(f FE) *builtins {
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))
}), }),
Put: r("!", func(f FE, _ XT) { f.Pop().(FPtr).Set(f.Pop()) }), New1: r("new1", func(f FE, _ XT) { f.Push(f.NewVar()) }),
Reg: r("reg", func(f FE, _ XT) { reg(f) }), Put: r("!", func(f FE, _ XT) { f.Pop().(FPtr).Set(f.Pop()) }),
Reg: r("reg", func(f FE, _ XT) { reg(f) }),
Swap: r("swap", func(f FE, _ XT) {
a := f.Pop()
b := f.Pop()
f.Push(a)
f.Push(b)
}),
Var: r("var", func(f FE, _ XT) { Var: r("var", func(f FE, _ XT) {
f.Register(forge.FCode(f.Pop().(string), f.Code(f.NewVar()))) f.Register(forge.FCode(f.Pop().(string), f.Code(f.NewVar())))
}), }),
} }
// b.Var1 = forge.Register(voc, forge.FCode("var1", // b.Var1 = forge.Register(voc, forge.FCode("var1",
//f.Code(f.Code(b.New1), b.Swap, b.Reg))) //f.Code(b.Code, b.Swap, b.Reg, b.New1, b.Comp)))
return &b return &b
} }
func reg(f FE) { func reg(f FE) {
f.Register(forge.FCode(f.Pop().(string), f.Pop().(FPtr))) f.Register(forge.FCode(f.Pop().(string), f.Pop().(FPtr).Reset()))
} }
func create(f FE, _ XT) { func create(f FE, _ XT) {

View file

@ -76,8 +76,6 @@ func (f *forgeEnv) Exec(items ...fitem) *forgeEnv {
return f.Call(f.Code(items...)) return f.Call(f.Code(items...))
} }
// core methods
func (f *forgeEnv) NewVar() fptr { func (f *forgeEnv) NewVar() fptr {
return newScalar() return newScalar()
} }

View file

@ -36,7 +36,7 @@ func (it *gofunc) Name() string {
return string(it.name) return string(it.name)
} }
// acode (anonymous code), fcode: forge code // acode: anonymous forge code
type acode struct { type acode struct {
code fptr code fptr
@ -58,6 +58,8 @@ func (it *acode) Name() string {
return "" return ""
} }
// fcode: named (and usually registered) forge code
type fcode struct { type fcode struct {
acode acode
name string name string