go-scopes/forge/xt.go

76 lines
1 KiB
Go

package forge
// XT (execution token)
type XT interface {
Name() string
Fct() Callable
Code() fptr
}
func Register(voc *fvoc, it XT) XT {
voc.Register(it.Name(), it)
return it
}
// gofunc: XT consisting only of a function written in Go
type gofunc struct {
fct Callable
name string
}
func GoFunc(n string, fct Callable) XT {
return &gofunc{fct, n}
}
func (it *gofunc) Fct() Callable {
return it.fct
}
func (it *gofunc) Code() fptr {
return nil
}
func (it *gofunc) Name() string {
return it.name
}
// acode: anonymous forge code
type acode struct {
code fptr
}
func AnonCode(c fptr) XT {
return &acode{c}
}
func (it *acode) Fct() Callable {
return func(f *forgeEnv) {
f.Call(it.Code().New())
}
}
func (it *acode) Code() fptr {
return it.code
}
func (it *acode) Name() string {
return ""
}
// fcode: named (and usually registered) forge code
type fcode struct {
acode
name string
}
func FCode(n string, c fptr) XT {
return &fcode{acode{c}, n}
}
func (it *fcode) Name() string {
return it.name
}