forge: get rid of XT parameter in callables
This commit is contained in:
parent
00a6e70430
commit
25357b1cb1
3 changed files with 29 additions and 33 deletions
|
@ -31,31 +31,31 @@ func setup(f FE) *builtins {
|
||||||
return forge.Register(voc, forge.GoFunc(name, fct))
|
return forge.Register(voc, forge.GoFunc(name, fct))
|
||||||
}
|
}
|
||||||
b := builtins{
|
b := builtins{
|
||||||
Add: r("+", func(f FE, _ XT) { f.Push(f.PopI() + f.PopI()) }),
|
Add: r("+", func(f FE) { f.Push(f.PopI() + f.PopI()) }),
|
||||||
Body: r("body", func(f FE, _ XT) { f.Push(f.Pop().(XT).Code().New().Next()) }),
|
Body: r("body", func(f FE) { 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) { f.Push(f.Code()) }),
|
||||||
Comp: r("comp", func(f FE, _ XT) { f.LatestXT().Code().Append(f.Pop()) }),
|
Comp: r("comp", func(f FE) { f.LatestXT().Code().Append(f.Pop()) }),
|
||||||
Do: r("do", func(f FE, _ XT) { f.Call(f.Literal().(FPtr)) }),
|
Do: r("do", func(f FE) { f.Call(f.Literal().(FPtr)) }),
|
||||||
Dot: r(".", func(f FE, _ XT) { fmt.Println(f.Peek(0)) }),
|
Dot: r(".", func(f FE) { fmt.Println(f.Peek(0)) }),
|
||||||
Drop: r("drop", func(f FE, _ XT) { f.Pop() }),
|
Drop: r("drop", func(f FE) { f.Pop() }),
|
||||||
Dup: r("dup", func(f FE, _ XT) { f.Push(f.Peek(0)) }),
|
Dup: r("dup", func(f FE) { f.Push(f.Peek(0)) }),
|
||||||
Get: r("@", func(f FE, _ XT) { f.Push(f.Pop().(FPtr).Value()) }),
|
Get: r("@", func(f FE) { f.Push(f.Pop().(FPtr).Value()) }),
|
||||||
If: r("if", func(f FE, _ XT) { doif(f) }),
|
If: r("if", func(f FE) { doif(f) }),
|
||||||
IfElse: r("if-else", func(f FE, _ XT) { doifelse(f) }),
|
IfElse: r("if-else", func(f FE) { doifelse(f) }),
|
||||||
Leave: r("leave", func(f FE, _ XT) { f.RPop() }),
|
Leave: r("leave", func(f FE) { f.RPop() }),
|
||||||
Lit: r("lit", func(f FE, _ XT) { f.Push(f.Literal()) }),
|
Lit: r("lit", func(f FE) { f.Push(f.Literal()) }),
|
||||||
LT: r("<", func(f FE, _ XT) { f.Push(f.PopI() > f.PopI()) }),
|
LT: r("<", func(f FE) { f.Push(f.PopI() > f.PopI()) }),
|
||||||
Mult: r("*", func(f FE, _ XT) { f.Push(f.PopI() * f.PopI()) }),
|
Mult: r("*", func(f FE) { f.Push(f.PopI() * f.PopI()) }),
|
||||||
New1: r("new1", func(f FE, _ XT) { f.Push(f.NewVar()) }),
|
New1: r("new1", func(f FE) { f.Push(f.NewVar()) }),
|
||||||
Over: r("over", func(f FE, _ XT) { f.Push(f.Peek(1)) }),
|
Over: r("over", func(f FE) { f.Push(f.Peek(1)) }),
|
||||||
Put: r("!", func(f FE, _ XT) { f.Pop().(FPtr).Set(f.Pop()) }),
|
Put: r("!", func(f FE) { f.Pop().(FPtr).Set(f.Pop()) }),
|
||||||
Reg: r("reg", func(f FE, _ XT) { doreg(f) }),
|
Reg: r("reg", func(f FE) { doreg(f) }),
|
||||||
Repeat: r("repeat", func(f FE, _ XT) { f.Reset() }),
|
Repeat: r("repeat", func(f FE) { f.Reset() }),
|
||||||
Sub: r("-", func(f FE, _ XT) {
|
Sub: r("-", func(f FE) {
|
||||||
a := f.PopI()
|
a := f.PopI()
|
||||||
f.Push(f.PopI() - a)
|
f.Push(f.PopI() - a)
|
||||||
}),
|
}),
|
||||||
Swap: r("swap", func(f FE, _ XT) { doswap(f) }),
|
Swap: r("swap", func(f FE) { doswap(f) }),
|
||||||
/*Append: r("append", func(f FE, _ XT) {
|
/*Append: r("append", func(f FE, _ XT) {
|
||||||
item := f.Pop()
|
item := f.Pop()
|
||||||
f.Peek(0).(FPtr).Append(item)
|
f.Peek(0).(FPtr).Append(item)
|
||||||
|
@ -96,10 +96,10 @@ func doreg(f FE) {
|
||||||
f.Register(forge.FCode(f.Pop().(string), f.Pop().(FPtr)))
|
f.Register(forge.FCode(f.Pop().(string), f.Pop().(FPtr)))
|
||||||
}
|
}
|
||||||
|
|
||||||
func create(f FE, _ XT) {
|
func create(f FE) {
|
||||||
name := f.Pop().(string)
|
name := f.Pop().(string)
|
||||||
does := forge.AnonCode(f.Pop().(FPtr))
|
does := forge.AnonCode(f.Pop().(FPtr))
|
||||||
f.Register(forge.GoFunc(name, func(f FE, _ XT) {
|
f.Register(forge.GoFunc(name, func(f FE) {
|
||||||
f.Register(forge.FCode(f.Pop().(string),
|
f.Register(forge.FCode(f.Pop().(string),
|
||||||
f.Code(f.NewVar(), does)))
|
f.Code(f.NewVar(), does)))
|
||||||
}))
|
}))
|
||||||
|
|
|
@ -16,7 +16,7 @@ type FPtr = fptr
|
||||||
type fstack = stack.Stack[fitem]
|
type fstack = stack.Stack[fitem]
|
||||||
type fvoc = voc.Vocabulary[fitem]
|
type fvoc = voc.Vocabulary[fitem]
|
||||||
|
|
||||||
type Callable func(*forgeEnv, XT)
|
type Callable func(*forgeEnv)
|
||||||
|
|
||||||
type forgeEnv struct {
|
type forgeEnv struct {
|
||||||
ds, rs fstack
|
ds, rs fstack
|
||||||
|
@ -63,7 +63,7 @@ func (f *forgeEnv) Call(code fptr) *forgeEnv {
|
||||||
for f.ip.Next() != nil {
|
for f.ip.Next() != nil {
|
||||||
value := f.ip.Value()
|
value := f.ip.Value()
|
||||||
if xt, ok := value.(XT); ok {
|
if xt, ok := value.(XT); ok {
|
||||||
xt.Fct()(f, xt)
|
xt.Fct()(f)
|
||||||
} else {
|
} else {
|
||||||
f.Push(value)
|
f.Push(value)
|
||||||
}
|
}
|
||||||
|
@ -123,9 +123,3 @@ func (f *forgeEnv) Register(xt XT) {
|
||||||
Register(f.Voc(), xt)
|
Register(f.Voc(), xt)
|
||||||
f.latestxt = xt
|
f.latestxt = xt
|
||||||
}
|
}
|
||||||
|
|
||||||
// basic functions for executable items
|
|
||||||
|
|
||||||
func doFCode(f *forgeEnv, xt XT) {
|
|
||||||
f.Call(xt.Code().New())
|
|
||||||
}
|
|
||||||
|
|
|
@ -47,7 +47,9 @@ func AnonCode(c fptr) XT {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (it *acode) Fct() Callable {
|
func (it *acode) Fct() Callable {
|
||||||
return doFCode
|
return func(f *forgeEnv) {
|
||||||
|
f.Call(it.Code().New())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (it *acode) Code() fptr {
|
func (it *acode) Code() fptr {
|
||||||
|
|
Loading…
Add table
Reference in a new issue