procm
procedural macros for Go
API is unstable. Work in progress.
Install
go get github.com/tdakkota/procm
Example
Declare eval
macro
eval.go
func eval(expr string) (types.TypeAndValue, error) {
fset := token.NewFileSet()
pack := types.NewPackage(".", ".")
return types.Eval(fset, pack, 0, expr)
}
//procm:macro=eval
func Eval(cursor macro.Context, node ast.Node) error {
if cursor.Pre {
return nil
}
return macro.OnlyFunction("eval", func(ctx macro.Context, call *ast.CallExpr) error {
for i := range call.Args {
switch v := call.Args[i].(type) {
case *ast.BasicLit:
value, err := eval(v.Value[1 : len(v.Value)-1])
if err != nil {
return err
}
cursor.Replace(&ast.BasicLit{
ValuePos: v.Pos(),
Kind: token.INT,
Value: value.Value.ExactString(),
})
}
}
return nil
}).Handle(cursor, node)
}
Input:
eval.go
package main
import "fmt"
//procm:use=eval
func evalTest() {
n := eval(`
1 + 1
`)
fmt.Print(n)
}
func main() {
evalTest()
}
Output:
package main
import "fmt"
//procm:use=eval
func evalTest() {
n := 2
fmt.Print(n)
}
func main() {
evalTest()
}
Also