forge: method Const() for storing and retrieving constant values
This commit is contained in:
parent
0638d39bd2
commit
0bb39f022f
2 changed files with 14 additions and 7 deletions
|
@ -42,6 +42,7 @@ func newFE(voc *fvoc) *forgeEnv {
|
|||
|
||||
var newVoc = voc.NewVoc[fitem]
|
||||
|
||||
var newScalar = ptr.NewScalar[fitem]
|
||||
var newPtr = ptr.NewSlice[fitem]
|
||||
|
||||
// xitem (executable item) / XT (execution token)
|
||||
|
@ -90,11 +91,18 @@ func (f *forgeEnv) Exec(items ...fitem) {
|
|||
}
|
||||
|
||||
func (f *forgeEnv) Def(name string, items ...fitem) XT {
|
||||
xt := Register(f.voc, name, callDef)
|
||||
xt := Register(f.voc, name, doDef)
|
||||
xt.body = newPtr(f.Code(items...)).Next()
|
||||
return xt
|
||||
}
|
||||
|
||||
func (f *forgeEnv) Const(name string, value fitem) XT {
|
||||
xt := Register(f.voc, name, doData)
|
||||
xt.body = newScalar()
|
||||
xt.body.Append(value)
|
||||
return xt
|
||||
}
|
||||
|
||||
func (f *forgeEnv) Literal() {
|
||||
f.Push(f.ip.Next().Value())
|
||||
}
|
||||
|
@ -115,16 +123,12 @@ func (f *forgeEnv) Peek(d int) fitem {
|
|||
return f.ds.Peek(d)
|
||||
}
|
||||
|
||||
func (f *forgeEnv) Const(name string) {
|
||||
}
|
||||
|
||||
// basic functions for executable items
|
||||
|
||||
func callDef(f *forgeEnv, xt XT) {
|
||||
func doDef(f *forgeEnv, xt XT) {
|
||||
f.Call(xt.body.Value().(fptr))
|
||||
}
|
||||
|
||||
func callData(f *forgeEnv, xt XT) {
|
||||
func doData(f *forgeEnv, xt XT) {
|
||||
f.Push(xt.body.Value())
|
||||
}
|
||||
|
||||
|
|
|
@ -22,4 +22,7 @@ func ExecTest(t *testing.T) {
|
|||
sq := fe.Def("square", b.Dup, b.Mult)
|
||||
fe.Exec(b.Lit, 3, sq, b.Lit, 2, b.Add)
|
||||
t.AssertEqual(fe.Pop(), 11)
|
||||
seven := fe.Const("seven", 7)
|
||||
fe.Exec(b.Lit, 3, seven, sq, b.Add)
|
||||
t.AssertEqual(fe.Pop(), 52)
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue