started thinking about macros
This commit is contained in:
parent
4bd9c94f82
commit
f7bc7be1f7
10
macros/builtins.go
Normal file
10
macros/builtins.go
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
package macros
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/mediocregopher/ginger/macros/pkgctx"
|
||||||
|
"github.com/mediocregopher/ginger/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Package(p *pkgctx.PkgCtx, el types.Elem) string {
|
||||||
|
return ""
|
||||||
|
}
|
30
macros/macros.go
Normal file
30
macros/macros.go
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
package macros
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/mediocregopher/ginger/macros/pkgctx"
|
||||||
|
"github.com/mediocregopher/ginger/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
// A Macro takes in a ginger structure and returns the go code which corresponds
|
||||||
|
// to it. The structure will contain everything in the calling list after the
|
||||||
|
// macro name (for example, (. jkjkNo error is returned, Bail can be called to stop compilation mid-way
|
||||||
|
// instead.
|
||||||
|
type Macro func(*pkgctx.PkgCtx, types.Elem) string
|
||||||
|
|
||||||
|
// Bail stops compilation. The given element should be the reason compilation
|
||||||
|
// has stopped
|
||||||
|
func Bail(el types.Elem, reason string) {
|
||||||
|
fmt.Fprintln(os.Stderr, reason)
|
||||||
|
time.Sleep(100 * time.Second)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bailf is like Bail, but takes in formatting
|
||||||
|
func Bailf(el types.Elem, format string, args ...interface{}) {
|
||||||
|
reason := fmt.Sprintf(format, args...)
|
||||||
|
Bail(el, reason)
|
||||||
|
}
|
18
macros/pkgctx/pkgctx.go
Normal file
18
macros/pkgctx/pkgctx.go
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
package pkgctx
|
||||||
|
|
||||||
|
// PkgCtx is given to all macros and represents the package that they are being
|
||||||
|
// evaluated within.
|
||||||
|
type PkgCtx struct {
|
||||||
|
|
||||||
|
// Packages describes the external packages imported by this one. Each key
|
||||||
|
// is the absolute package path, the value is the alias for it (or empty
|
||||||
|
// string for no alias)
|
||||||
|
Packages map[string]string
|
||||||
|
|
||||||
|
// CallDict is a map used by Eval for making actual calls dynamically. The
|
||||||
|
// key is the string representation of the call to be used (for example,
|
||||||
|
// "fmt.Println") and must agree with the aliases being used in Packages.
|
||||||
|
// The value need not be set during actual compilation, but it is useful to
|
||||||
|
// use it during testing
|
||||||
|
CallDict map[string]interface{}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user