From 25357b1cb13f1448fddce1e70afd7b8e2f7734f5 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Tue, 30 Apr 2024 14:13:05 +0200 Subject: [PATCH] forge: get rid of XT parameter in callables --- forge/builtins/builtins.go | 48 +++++++++++++++++++------------------- forge/forge.go | 10 ++------ forge/xt.go | 4 +++- 3 files changed, 29 insertions(+), 33 deletions(-) diff --git a/forge/builtins/builtins.go b/forge/builtins/builtins.go index d462015..710b77a 100644 --- a/forge/builtins/builtins.go +++ b/forge/builtins/builtins.go @@ -31,31 +31,31 @@ func setup(f FE) *builtins { return forge.Register(voc, forge.GoFunc(name, fct)) } b := builtins{ - Add: r("+", func(f FE, _ XT) { f.Push(f.PopI() + f.PopI()) }), - 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()) }), - Comp: r("comp", func(f FE, _ XT) { f.LatestXT().Code().Append(f.Pop()) }), - Do: r("do", func(f FE, _ XT) { f.Call(f.Literal().(FPtr)) }), - Dot: r(".", func(f FE, _ XT) { fmt.Println(f.Peek(0)) }), - Drop: r("drop", func(f FE, _ XT) { f.Pop() }), - Dup: r("dup", func(f FE, _ XT) { f.Push(f.Peek(0)) }), - Get: r("@", func(f FE, _ XT) { f.Push(f.Pop().(FPtr).Value()) }), - If: r("if", func(f FE, _ XT) { doif(f) }), - IfElse: r("if-else", func(f FE, _ XT) { doifelse(f) }), - Leave: r("leave", func(f FE, _ XT) { f.RPop() }), - Lit: r("lit", func(f FE, _ XT) { f.Push(f.Literal()) }), - LT: 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()) }), - Over: r("over", func(f FE, _ XT) { f.Push(f.Peek(1)) }), - Put: r("!", func(f FE, _ XT) { f.Pop().(FPtr).Set(f.Pop()) }), - Reg: r("reg", func(f FE, _ XT) { doreg(f) }), - Repeat: r("repeat", func(f FE, _ XT) { f.Reset() }), - Sub: r("-", func(f FE, _ XT) { + Add: r("+", func(f FE) { f.Push(f.PopI() + f.PopI()) }), + Body: r("body", func(f FE) { f.Push(f.Pop().(XT).Code().New().Next()) }), + Code: r("code", func(f FE) { f.Push(f.Code()) }), + Comp: r("comp", func(f FE) { f.LatestXT().Code().Append(f.Pop()) }), + Do: r("do", func(f FE) { f.Call(f.Literal().(FPtr)) }), + Dot: r(".", func(f FE) { fmt.Println(f.Peek(0)) }), + Drop: r("drop", func(f FE) { f.Pop() }), + Dup: r("dup", func(f FE) { f.Push(f.Peek(0)) }), + Get: r("@", func(f FE) { f.Push(f.Pop().(FPtr).Value()) }), + If: r("if", func(f FE) { doif(f) }), + IfElse: r("if-else", func(f FE) { doifelse(f) }), + Leave: r("leave", func(f FE) { f.RPop() }), + Lit: r("lit", func(f FE) { f.Push(f.Literal()) }), + LT: r("<", func(f FE) { f.Push(f.PopI() > f.PopI()) }), + Mult: r("*", func(f FE) { f.Push(f.PopI() * f.PopI()) }), + New1: r("new1", func(f FE) { f.Push(f.NewVar()) }), + Over: r("over", func(f FE) { f.Push(f.Peek(1)) }), + Put: r("!", func(f FE) { f.Pop().(FPtr).Set(f.Pop()) }), + Reg: r("reg", func(f FE) { doreg(f) }), + Repeat: r("repeat", func(f FE) { f.Reset() }), + Sub: r("-", func(f FE) { a := f.PopI() 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) { item := f.Pop() f.Peek(0).(FPtr).Append(item) @@ -96,10 +96,10 @@ func doreg(f FE) { f.Register(forge.FCode(f.Pop().(string), f.Pop().(FPtr))) } -func create(f FE, _ XT) { +func create(f FE) { name := f.Pop().(string) 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.Code(f.NewVar(), does))) })) diff --git a/forge/forge.go b/forge/forge.go index 7f0cea5..362c86c 100644 --- a/forge/forge.go +++ b/forge/forge.go @@ -16,7 +16,7 @@ type FPtr = fptr type fstack = stack.Stack[fitem] type fvoc = voc.Vocabulary[fitem] -type Callable func(*forgeEnv, XT) +type Callable func(*forgeEnv) type forgeEnv struct { ds, rs fstack @@ -63,7 +63,7 @@ func (f *forgeEnv) Call(code fptr) *forgeEnv { for f.ip.Next() != nil { value := f.ip.Value() if xt, ok := value.(XT); ok { - xt.Fct()(f, xt) + xt.Fct()(f) } else { f.Push(value) } @@ -123,9 +123,3 @@ func (f *forgeEnv) Register(xt XT) { Register(f.Voc(), xt) f.latestxt = xt } - -// basic functions for executable items - -func doFCode(f *forgeEnv, xt XT) { - f.Call(xt.Code().New()) -} diff --git a/forge/xt.go b/forge/xt.go index 2f39db3..41d7784 100644 --- a/forge/xt.go +++ b/forge/xt.go @@ -47,7 +47,9 @@ func AnonCode(c fptr) XT { } func (it *acode) Fct() Callable { - return doFCode + return func(f *forgeEnv) { + f.Call(it.Code().New()) + } } func (it *acode) Code() fptr {