forge: get rid of XT parameter in callables

This commit is contained in:
Helmut Merz 2024-04-30 14:13:05 +02:00
parent 00a6e70430
commit 25357b1cb1
3 changed files with 29 additions and 33 deletions

View file

@ -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)))
})) }))

View file

@ -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())
}

View file

@ -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 {