67 lines
1.3 KiB
Go
67 lines
1.3 KiB
Go
// Package rep implements representations of Forge code - internal ones
|
|
// as slices and maps and corresponding external ones using serialization
|
|
// formats like JSON and YAML.
|
|
package rep
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"git.sr.ht/~cco/go-scopes/common/voc"
|
|
"git.sr.ht/~cco/go-scopes/forge"
|
|
)
|
|
|
|
// may be: code, module, string, int, float
|
|
type citem interface{}
|
|
|
|
type coderep interface {
|
|
Compile(forge.FE) forge.FPtr
|
|
}
|
|
|
|
// code, represented by a slice
|
|
|
|
type code []citem
|
|
|
|
func Code(items ...citem) code {
|
|
return code(items)
|
|
}
|
|
|
|
func (ci code) Compile(f forge.FE) forge.FPtr {
|
|
c := f.Code()
|
|
for _, item := range ci {
|
|
switch i := item.(type) {
|
|
case int:
|
|
c.Append(i)
|
|
case float64:
|
|
c.Append(int(i))
|
|
case string:
|
|
if v, err := compStr(f, i); err == nil {
|
|
c.Append(v)
|
|
} else {
|
|
fmt.Println(err)
|
|
}
|
|
case code:
|
|
c.Append(i.Compile(f))
|
|
}
|
|
}
|
|
return c.Reset()
|
|
}
|
|
|
|
func compStr(f forge.FE, s string) (forge.FItem, error) {
|
|
if strings.HasPrefix(s, "'") {
|
|
return forge.FItem(strings.Trim(s, "'")), nil
|
|
}
|
|
if v, ok := f.Voc().Lookup(s); ok {
|
|
return forge.FItem(v), nil
|
|
}
|
|
return nil, fmt.Errorf("not found: %s", s)
|
|
}
|
|
|
|
// module - code definitions, represented by a map
|
|
|
|
type module map[string]citem
|
|
|
|
func (m module) Compile(f forge.FE) forge.FPtr {
|
|
v := voc.NewVoc(f.Voc())
|
|
return f.Code(v)
|
|
}
|