forge: add data manipulation definitions (Create, Get, Put)
This commit is contained in:
parent
8e2796d531
commit
08b9391559
3 changed files with 15 additions and 6 deletions
|
@ -6,7 +6,7 @@ type FE = forge.FE
|
||||||
type XT = forge.XT
|
type XT = forge.XT
|
||||||
|
|
||||||
type builtins struct {
|
type builtins struct {
|
||||||
Add, Dup, Lit, Mult XT
|
Add, Dup, Get, Lit, Mult, Put XT
|
||||||
}
|
}
|
||||||
|
|
||||||
func Get(f FE) *builtins {
|
func Get(f FE) *builtins {
|
||||||
|
@ -27,7 +27,9 @@ func setup(f FE) *builtins {
|
||||||
return &builtins{
|
return &builtins{
|
||||||
Add: r("+", func(f FE, _ XT) { f.Push(f.Pop().(int) + f.Pop().(int)) }),
|
Add: r("+", func(f FE, _ XT) { f.Push(f.Pop().(int) + f.Pop().(int)) }),
|
||||||
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().(forge.FPtr).Value()) }),
|
||||||
Lit: r("literal", func(f FE, _ XT) { f.Literal() }),
|
Lit: r("literal", func(f FE, _ XT) { f.Literal() }),
|
||||||
Mult: r("*", func(f FE, _ XT) { f.Push(f.Pop().(int) * f.Pop().(int)) }),
|
Mult: r("*", func(f FE, _ XT) { f.Push(f.Pop().(int) * f.Pop().(int)) }),
|
||||||
|
Put: r("!", func(f FE, _ XT) { f.Pop().(forge.FPtr).Set(f.Pop()) }),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,8 @@ import (
|
||||||
type fitem interface{}
|
type fitem interface{}
|
||||||
|
|
||||||
type fptr = ptr.Ptr[fitem]
|
type fptr = ptr.Ptr[fitem]
|
||||||
|
type FPtr = fptr
|
||||||
|
|
||||||
type fstack = stack.Stack[fitem]
|
type fstack = stack.Stack[fitem]
|
||||||
type fvoc = voc.Vocabulary[fitem]
|
type fvoc = voc.Vocabulary[fitem]
|
||||||
|
|
||||||
|
@ -163,9 +165,9 @@ func (f *forgeEnv) Def(name string, items ...fitem) XT {
|
||||||
return Register(f.voc, FCode(name, code))
|
return Register(f.voc, FCode(name, code))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *forgeEnv) Const(name string, value fitem) XT {
|
func (f *forgeEnv) Create(name string, value fitem, code fptr) XT {
|
||||||
data := newScalar().Append(value)
|
data := newScalar().Set(value)
|
||||||
return Register(f.voc, Data(name, data, nil))
|
return Register(f.voc, Data(name, data, code))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *forgeEnv) Literal() {
|
func (f *forgeEnv) Literal() {
|
||||||
|
@ -195,5 +197,9 @@ func doDef(f *forgeEnv, xt XT) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func doData(f *forgeEnv, xt XT) {
|
func doData(f *forgeEnv, xt XT) {
|
||||||
f.Push(xt.Data().Value())
|
f.Push(xt.Data())
|
||||||
|
code := xt.Code()
|
||||||
|
if code != nil {
|
||||||
|
f.Call(code)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,8 @@ func ExecTest(t *testing.T) {
|
||||||
sq := fe.Def("square", b.Dup, b.Mult)
|
sq := fe.Def("square", b.Dup, b.Mult)
|
||||||
fe.Exec(b.Lit, 3, sq, b.Lit, 2, b.Add)
|
fe.Exec(b.Lit, 3, sq, b.Lit, 2, b.Add)
|
||||||
t.AssertEqual(fe.Pop(), 11)
|
t.AssertEqual(fe.Pop(), 11)
|
||||||
seven := fe.Const("seven", 7)
|
seven := fe.Create("seven", 7, fe.Code(b.Get))
|
||||||
|
//fe.Exec(b.Lit, 7, seven, b.Put)
|
||||||
fe.Exec(b.Lit, 3, seven, sq, b.Add)
|
fe.Exec(b.Lit, 3, seven, sq, b.Add)
|
||||||
t.AssertEqual(fe.Pop(), 52)
|
t.AssertEqual(fe.Pop(), 52)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue