forge: work in progress: control words: if, if-else, leave, repeat
This commit is contained in:
parent
5ae3f3e645
commit
57f4c1535b
2 changed files with 42 additions and 13 deletions
|
@ -9,7 +9,8 @@ type XT = forge.XT
|
||||||
type FPtr = forge.FPtr
|
type FPtr = forge.FPtr
|
||||||
|
|
||||||
type builtins struct {
|
type builtins struct {
|
||||||
Add, Body, Code, Comp, Dup, Get, Lit, Mult, New1, Put, Reg, Swap XT
|
Add, Body, Code, Comp, Drop, Dup, Get, If, IfElse, Leave, Lit, Mult,
|
||||||
|
New1, Put, Reg, Repeat, Swap,
|
||||||
Var1 XT
|
Var1 XT
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,13 +37,16 @@ func setup(f FE) *builtins {
|
||||||
Body: r("body", func(f FE, _ XT) { f.Push(f.Pop().(XT).Code().New().Next()) }),
|
Body: r("body", func(f FE, _ XT) { f.Push(f.Pop().(XT).Code().New().Next()) }),
|
||||||
Code: r("code", func(f FE, _ XT) { f.Push(f.Code()) }),
|
Code: r("code", func(f FE, _ XT) { f.Push(f.Code()) }),
|
||||||
Comp: r("comp", func(f FE, _ XT) { f.LatestXT().Code().Append(f.Pop()) }),
|
Comp: r("comp", func(f FE, _ XT) { f.LatestXT().Code().Append(f.Pop()) }),
|
||||||
|
Drop: r("drop", func(f FE, _ XT) { 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()) }),
|
||||||
|
Leave: r("leave", func(f FE, _ XT) { f.RPop() }),
|
||||||
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) { f.Push(f.PopI() * f.PopI()) }),
|
Mult: r("*", func(f FE, _ XT) { f.Push(f.PopI() * f.PopI()) }),
|
||||||
New1: r("new1", func(f FE, _ XT) { f.Push(f.NewVar()) }),
|
New1: r("new1", func(f FE, _ XT) { f.Push(f.NewVar()) }),
|
||||||
Put: r("!", func(f FE, _ XT) { f.Pop().(FPtr).Set(f.Pop()) }),
|
Put: r("!", func(f FE, _ XT) { f.Pop().(FPtr).Set(f.Pop()) }),
|
||||||
Reg: r("reg", func(f FE, _ XT) { reg(f) }),
|
Reg: r("reg", func(f FE, _ XT) { reg(f) }),
|
||||||
|
Repeat: r("repeat", func(f FE, _ XT) { f.Reset() }),
|
||||||
Swap: r("swap", func(f FE, _ XT) {
|
Swap: r("swap", func(f FE, _ XT) {
|
||||||
a := f.Pop()
|
a := f.Pop()
|
||||||
b := f.Pop()
|
b := f.Pop()
|
||||||
|
@ -57,6 +61,23 @@ func setup(f FE) *builtins {
|
||||||
return &b
|
return &b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func doif(f FE) {
|
||||||
|
ifBranch := f.Literal().(FPtr)
|
||||||
|
if f.Pop().(bool) {
|
||||||
|
f.Call(ifBranch)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func doifelse(f FE) {
|
||||||
|
ifBranch := f.Literal().(FPtr)
|
||||||
|
elseBranch := f.Literal().(FPtr)
|
||||||
|
if f.Pop().(bool) {
|
||||||
|
f.Call(ifBranch)
|
||||||
|
} else {
|
||||||
|
f.Call(elseBranch)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
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)))
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,7 +68,7 @@ func (f *forgeEnv) Call(code fptr) *forgeEnv {
|
||||||
f.Push(value)
|
f.Push(value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
f.ip = f.rs.Pop().(fptr)
|
f.ip = f.RPop()
|
||||||
return f
|
return f
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -104,6 +104,14 @@ func (f *forgeEnv) Peek(d int) fitem {
|
||||||
return f.ds.Peek(d)
|
return f.ds.Peek(d)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (f *forgeEnv) RPop() fptr {
|
||||||
|
return f.rs.Pop().(fptr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *forgeEnv) Reset() fptr {
|
||||||
|
return f.ip.Reset()
|
||||||
|
}
|
||||||
|
|
||||||
func (f *forgeEnv) LatestXT() XT {
|
func (f *forgeEnv) LatestXT() XT {
|
||||||
return f.latestxt
|
return f.latestxt
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue