76 lines
1 KiB
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
|
|
}
|