more built-ins for code creation
This commit is contained in:
parent
0852ba19fd
commit
98231b070b
3 changed files with 20 additions and 8 deletions
|
@ -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) {
|
||||||
|
|
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Reference in a new issue