cue: prepare to hoist builtin code

Staightforward renaming and deletion of dead code.

Change-Id: I3b77b0b0f50914791cc00653a44c82dfebd0b0db
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/6881
Reviewed-by: Marcel van Lohuizen <mpvl@golang.org>
diff --git a/cue/builtin.go b/cue/builtin.go
index 6ef6621..e149554 100644
--- a/cue/builtin.go
+++ b/cue/builtin.go
@@ -38,7 +38,7 @@
 	"cuelang.org/go/internal/core/runtime"
 )
 
-// A builtin is a builtin function or constant.
+// A Builtin is a builtin function or constant.
 //
 // A function may return and a constant may be any of the following types:
 //
@@ -56,32 +56,31 @@
 //   []T
 //   map[string]T
 //
-type builtin struct {
+type Builtin struct {
 	Name   string
-	pkg    label
-	Params []kind
-	Result kind
-	Func   func(c *callCtxt)
-	// Const  interface{}
-	Const string
+	Pkg    adt.Feature
+	Params []adt.Kind
+	Result adt.Kind
+	Func   func(c *CallCtxt)
+	Const  string
 }
 
-type builtinPkg struct {
-	native []*builtin
-	cue    string
+type Package struct {
+	Native []*Builtin
+	CUE    string
 }
 
-func mustCompileBuiltins(ctx *context, p *builtinPkg, pkgName string) *adt.Vertex {
+func (p *Package) MustCompile(ctx *adt.OpContext, pkgName string) *adt.Vertex {
 	obj := &adt.Vertex{}
-	pkgLabel := ctx.Label(pkgName, false)
+	pkgLabel := ctx.StringLabel(pkgName)
 	st := &adt.StructLit{}
-	if len(p.native) > 0 {
+	if len(p.Native) > 0 {
 		obj.AddConjunct(adt.MakeConjunct(nil, st))
 	}
-	for _, b := range p.native {
-		b.pkg = pkgLabel
+	for _, b := range p.Native {
+		b.Pkg = pkgLabel
 
-		f := ctx.Label(b.Name, false) // never starts with _
+		f := ctx.StringLabel(b.Name) // never starts with _
 		// n := &node{baseValue: newBase(imp.Path)}
 		var v adt.Expr = toBuiltin(ctx, b)
 		if b.Const != "" {
@@ -94,32 +93,32 @@
 	}
 
 	// Parse builtin CUE
-	if p.cue != "" {
-		expr, err := parser.ParseExpr(pkgName, p.cue)
+	if p.CUE != "" {
+		expr, err := parser.ParseExpr(pkgName, p.CUE)
 		if err != nil {
-			panic(fmt.Errorf("could not parse %v: %v", p.cue, err))
+			panic(fmt.Errorf("could not parse %v: %v", p.CUE, err))
 		}
-		c, err := compile.Expr(nil, ctx.opCtx.Runtime, expr)
+		c, err := compile.Expr(nil, ctx.Runtime, expr)
 		if err != nil {
-			panic(fmt.Errorf("could compile parse %v: %v", p.cue, err))
+			panic(fmt.Errorf("could compile parse %v: %v", p.CUE, err))
 		}
 		obj.AddConjunct(c)
 	}
 
 	// We could compile lazily, but this is easier for debugging.
-	obj.Finalize(ctx.opCtx)
-	if err := obj.Err(ctx.opCtx, adt.Finalized); err != nil {
+	obj.Finalize(ctx)
+	if err := obj.Err(ctx, adt.Finalized); err != nil {
 		panic(err.Err)
 	}
 
 	return obj
 }
 
-func toBuiltin(ctx *context, b *builtin) *adt.Builtin {
+func toBuiltin(ctx *adt.OpContext, b *Builtin) *adt.Builtin {
 	x := &adt.Builtin{
 		Params:  b.Params,
 		Result:  b.Result,
-		Package: b.pkg,
+		Package: b.Pkg,
 		Name:    b.Name,
 	}
 	x.Func = func(ctx *adt.OpContext, args []adt.Value) (ret adt.Expr) {
@@ -127,43 +126,42 @@
 		index := runtime.Data.(*index)
 
 		// call, _ := ctx.Source().(*ast.CallExpr)
-		c := &callCtxt{
-			idx: index,
+		c := &CallCtxt{
 			// src:  call,
 			ctx:     index.newContext(),
 			args:    args,
 			builtin: b,
 		}
 		defer func() {
-			var errVal interface{} = c.err
+			var errVal interface{} = c.Err
 			if err := recover(); err != nil {
 				errVal = err
 			}
 			ret = processErr(c, errVal, ret)
 		}()
 		b.Func(c)
-		switch v := c.ret.(type) {
+		switch v := c.Ret.(type) {
 		case adt.Value:
 			return v
 		case *valueError:
 			return v.err
 		}
-		if c.err != nil {
+		if c.Err != nil {
 			return nil
 		}
-		return convert.GoValueToValue(ctx, c.ret, true)
+		return convert.GoValueToValue(ctx, c.Ret, true)
 	}
 	return x
 }
 
 // newConstBuiltin parses and creates any CUE expression that does not have
 // fields.
-func mustParseConstBuiltin(ctx *context, name, val string) adt.Expr {
+func mustParseConstBuiltin(ctx *adt.OpContext, name, val string) adt.Expr {
 	expr, err := parser.ParseExpr("<builtin:"+name+">", val)
 	if err != nil {
 		panic(err)
 	}
-	c, err := compile.Expr(nil, ctx.Runtime, expr)
+	c, err := compile.Expr(nil, ctx, expr)
 	if err != nil {
 		panic(err)
 	}
@@ -182,18 +180,18 @@
 	return src.Pos()
 }
 
-func (x *builtin) name(ctx *context) string {
-	if x.pkg == 0 {
+func (x *Builtin) name(ctx *context) string {
+	if x.Pkg == 0 {
 		return x.Name
 	}
-	return fmt.Sprintf("%s.%s", ctx.LabelStr(x.pkg), x.Name)
+	return fmt.Sprintf("%s.%s", ctx.LabelStr(x.Pkg), x.Name)
 }
 
-func (x *builtin) isValidator() bool {
-	return len(x.Params) == 1 && x.Result == boolKind
+func (x *Builtin) isValidator() bool {
+	return len(x.Params) == 1 && x.Result == adt.BoolKind
 }
 
-func processErr(call *callCtxt, errVal interface{}, ret adt.Expr) adt.Expr {
+func processErr(call *CallCtxt, errVal interface{}, ret adt.Expr) adt.Expr {
 	ctx := call.ctx
 	src := call.src
 	switch err := errVal.(type) {
@@ -211,7 +209,7 @@
 	case errors.Error:
 		ret = wrapCallErr(call, &adt.Bottom{Err: err})
 	case error:
-		if call.err == internal.ErrIncomplete {
+		if call.Err == internal.ErrIncomplete {
 			ret = ctx.mkErr(src, codeIncomplete, "incomplete value")
 		} else {
 			// TODO: store the underlying error explicitly
@@ -226,7 +224,7 @@
 	return ret
 }
 
-func wrapCallErr(c *callCtxt, b *adt.Bottom) *adt.Bottom {
+func wrapCallErr(c *CallCtxt, b *adt.Bottom) *adt.Bottom {
 	pos := token.NoPos
 	if c.src != nil {
 		if src := c.src.Source(); src != nil {
@@ -240,7 +238,7 @@
 	}
 }
 
-func (c *callCtxt) convertError(x interface{}, name string) *adt.Bottom {
+func (c *CallCtxt) convertError(x interface{}, name string) *adt.Bottom {
 	var err errors.Error
 	switch v := x.(type) {
 	case nil:
@@ -259,7 +257,7 @@
 		if name != "" {
 			err = errors.Newf(c.Pos(), "%s: %v", name, v)
 		} else {
-			err = errors.Newf(c.Pos(), "error in call to %s: %v", c.name(), v)
+			err = errors.Newf(c.Pos(), "error in call to %s: %v", c.Name(), v)
 		}
 
 	default:
@@ -268,39 +266,38 @@
 	if err != internal.ErrIncomplete {
 		return &adt.Bottom{
 			// Wrap to preserve position information.
-			Err: errors.Wrapf(err, c.Pos(), "error in call to %s", c.name()),
+			Err: errors.Wrapf(err, c.Pos(), "error in call to %s", c.Name()),
 		}
 	}
 	return &adt.Bottom{
 		Code: adt.IncompleteError,
-		Err:  errors.Newf(c.Pos(), "incomplete values in call to %s", c.name()),
+		Err:  errors.Newf(c.Pos(), "incomplete values in call to %s", c.Name()),
 	}
 }
 
-// callCtxt is passed to builtin implementations.
-type callCtxt struct {
-	idx     *index
+// CallCtxt is passed to builtin implementations that need to use a cue.Value. This is an internal type. It's interface may change.
+type CallCtxt struct {
 	src     adt.Expr // *adt.CallExpr
 	ctx     *context
-	builtin *builtin
-	err     interface{}
-	ret     interface{}
+	builtin *Builtin
+	Err     interface{}
+	Ret     interface{}
 
 	args []adt.Value
 }
 
-func (c *callCtxt) Pos() token.Pos {
+func (c *CallCtxt) Pos() token.Pos {
 	return c.ctx.opCtx.Pos()
 }
 
-func (c *callCtxt) name() string {
+func (c *CallCtxt) Name() string {
 	return c.builtin.name(c.ctx)
 }
 
 var builtins = map[string]*Instance{}
 
-func initBuiltins(pkgs map[string]*builtinPkg) {
-	ctx := sharedIndex.newContext()
+func initBuiltins(pkgs map[string]*Package) {
+	ctx := sharedIndex.newContext().opCtx
 	keys := []string{}
 	for k := range pkgs {
 		keys = append(keys, k)
@@ -308,7 +305,7 @@
 	sort.Strings(keys)
 	for _, k := range keys {
 		b := pkgs[k]
-		e := mustCompileBuiltins(ctx, b, k)
+		e := b.MustCompile(ctx, k)
 
 		i := sharedIndex.addInst(&Instance{
 			ImportPath: k,
@@ -349,20 +346,20 @@
 	}
 }
 
-// do returns whether the call should be done.
-func (c *callCtxt) do() bool {
-	return c.err == nil
+// Do returns whether the call should be done.
+func (c *CallCtxt) Do() bool {
+	return c.Err == nil
 }
 
 type callError struct {
-	b *bottom
+	b *adt.Bottom
 }
 
 func (e *callError) Error() string {
 	return fmt.Sprint(e.b)
 }
 
-func (c *callCtxt) errf(src source, underlying error, format string, args ...interface{}) {
+func (c *CallCtxt) errf(src adt.Node, underlying error, format string, args ...interface{}) {
 	a := make([]interface{}, 0, 2+len(args))
 	if err, ok := underlying.(*valueError); ok {
 		a = append(a, err.err)
@@ -370,19 +367,19 @@
 	a = append(a, format)
 	a = append(a, args...)
 	err := c.ctx.mkErr(src, a...)
-	c.err = &callError{err}
+	c.Err = &callError{err}
 }
 
-func (c *callCtxt) errcf(src source, code adt.ErrorCode, format string, args ...interface{}) {
+func (c *CallCtxt) errcf(src adt.Node, code adt.ErrorCode, format string, args ...interface{}) {
 	a := make([]interface{}, 0, 2+len(args))
 	a = append(a, code)
 	a = append(a, format)
 	a = append(a, args...)
 	err := c.ctx.mkErr(src, a...)
-	c.err = &callError{err}
+	c.Err = &callError{err}
 }
 
-func (c *callCtxt) value(i int) Value {
+func (c *CallCtxt) Value(i int) Value {
 	v := newValueRoot(c.ctx, c.args[i])
 	// TODO: remove default
 	// v, _ = v.Default()
@@ -392,7 +389,7 @@
 	return v
 }
 
-func (c *callCtxt) structVal(i int) *Struct {
+func (c *CallCtxt) Struct(i int) *Struct {
 	v := newValueRoot(c.ctx, c.args[i])
 	s, err := v.Struct()
 	if err != nil {
@@ -402,9 +399,9 @@
 	return s
 }
 
-func (c *callCtxt) invalidArgType(arg value, i int, typ string, err error) {
+func (c *CallCtxt) invalidArgType(arg adt.Expr, i int, typ string, err error) {
 	if ve, ok := err.(*valueError); ok && ve.err.IsIncomplete() {
-		c.err = ve
+		c.Err = ve
 		return
 	}
 	v, ok := arg.(adt.Value)
@@ -413,27 +410,27 @@
 	if !ok {
 		c.errf(c.src, nil,
 			"cannot use incomplete value %s as %s in argument %d to %s: %v",
-			c.ctx.str(arg), typ, i, c.name(), err)
+			c.ctx.str(arg), typ, i, c.Name(), err)
 	}
 	if err != nil {
 		c.errf(c.src, err,
 			"cannot use %s (type %s) as %s in argument %d to %s: %v",
-			c.ctx.str(arg), v.Kind(), typ, i, c.name(), err)
+			c.ctx.str(arg), v.Kind(), typ, i, c.Name(), err)
 	} else {
 		c.errf(c.src, err,
 			"cannot use %s (type %s) as %s in argument %d to %s",
-			c.ctx.str(arg), v.Kind(), typ, i, c.name())
+			c.ctx.str(arg), v.Kind(), typ, i, c.Name())
 	}
 }
 
-func (c *callCtxt) int(i int) int     { return int(c.intValue(i, 64, "int64")) }
-func (c *callCtxt) int8(i int) int8   { return int8(c.intValue(i, 8, "int8")) }
-func (c *callCtxt) int16(i int) int16 { return int16(c.intValue(i, 16, "int16")) }
-func (c *callCtxt) int32(i int) int32 { return int32(c.intValue(i, 32, "int32")) }
-func (c *callCtxt) rune(i int) rune   { return rune(c.intValue(i, 32, "rune")) }
-func (c *callCtxt) int64(i int) int64 { return int64(c.intValue(i, 64, "int64")) }
+func (c *CallCtxt) Int(i int) int     { return int(c.intValue(i, 64, "int64")) }
+func (c *CallCtxt) Int8(i int) int8   { return int8(c.intValue(i, 8, "int8")) }
+func (c *CallCtxt) Int16(i int) int16 { return int16(c.intValue(i, 16, "int16")) }
+func (c *CallCtxt) Int32(i int) int32 { return int32(c.intValue(i, 32, "int32")) }
+func (c *CallCtxt) Rune(i int) rune   { return rune(c.intValue(i, 32, "rune")) }
+func (c *CallCtxt) Int64(i int) int64 { return int64(c.intValue(i, 64, "int64")) }
 
-func (c *callCtxt) intValue(i, bits int, typ string) int64 {
+func (c *CallCtxt) intValue(i, bits int, typ string) int64 {
 	arg := c.args[i]
 	x := newValueRoot(c.ctx, arg)
 	n, err := x.Int(nil)
@@ -443,20 +440,20 @@
 	}
 	if n.BitLen() > bits {
 		c.errf(c.src, err, "int %s overflows %s in argument %d in call to %s",
-			n, typ, i, c.name())
+			n, typ, i, c.Name())
 	}
 	res, _ := x.Int64()
 	return res
 }
 
-func (c *callCtxt) uint(i int) uint     { return uint(c.uintValue(i, 64, "uint64")) }
-func (c *callCtxt) uint8(i int) uint8   { return uint8(c.uintValue(i, 8, "uint8")) }
-func (c *callCtxt) byte(i int) uint8    { return byte(c.uintValue(i, 8, "byte")) }
-func (c *callCtxt) uint16(i int) uint16 { return uint16(c.uintValue(i, 16, "uint16")) }
-func (c *callCtxt) uint32(i int) uint32 { return uint32(c.uintValue(i, 32, "uint32")) }
-func (c *callCtxt) uint64(i int) uint64 { return uint64(c.uintValue(i, 64, "uint64")) }
+func (c *CallCtxt) Uint(i int) uint     { return uint(c.uintValue(i, 64, "uint64")) }
+func (c *CallCtxt) Uint8(i int) uint8   { return uint8(c.uintValue(i, 8, "uint8")) }
+func (c *CallCtxt) Byte(i int) uint8    { return byte(c.uintValue(i, 8, "byte")) }
+func (c *CallCtxt) Uint16(i int) uint16 { return uint16(c.uintValue(i, 16, "uint16")) }
+func (c *CallCtxt) Uint32(i int) uint32 { return uint32(c.uintValue(i, 32, "uint32")) }
+func (c *CallCtxt) Uint64(i int) uint64 { return uint64(c.uintValue(i, 64, "uint64")) }
 
-func (c *callCtxt) uintValue(i, bits int, typ string) uint64 {
+func (c *CallCtxt) uintValue(i, bits int, typ string) uint64 {
 	x := newValueRoot(c.ctx, c.args[i])
 	n, err := x.Int(nil)
 	if err != nil || n.Sign() < 0 {
@@ -465,13 +462,13 @@
 	}
 	if n.BitLen() > bits {
 		c.errf(c.src, err, "int %s overflows %s in argument %d in call to %s",
-			n, typ, i, c.name())
+			n, typ, i, c.Name())
 	}
 	res, _ := x.Uint64()
 	return res
 }
 
-func (c *callCtxt) decimal(i int) *apd.Decimal {
+func (c *CallCtxt) Decimal(i int) *apd.Decimal {
 	x := newValueRoot(c.ctx, c.args[i])
 	if _, err := x.MantExp(nil); err != nil {
 		c.invalidArgType(c.args[i], i, "Decimal", err)
@@ -480,7 +477,7 @@
 	return &c.args[i].(*numLit).X
 }
 
-func (c *callCtxt) float64(i int) float64 {
+func (c *CallCtxt) Float64(i int) float64 {
 	x := newValueRoot(c.ctx, c.args[i])
 	res, err := x.Float64()
 	if err != nil {
@@ -490,7 +487,7 @@
 	return res
 }
 
-func (c *callCtxt) bigInt(i int) *big.Int {
+func (c *CallCtxt) BigInt(i int) *big.Int {
 	x := newValueRoot(c.ctx, c.args[i])
 	n, err := x.Int(nil)
 	if err != nil {
@@ -502,7 +499,7 @@
 
 var ten = big.NewInt(10)
 
-func (c *callCtxt) bigFloat(i int) *big.Float {
+func (c *CallCtxt) BigFloat(i int) *big.Float {
 	x := newValueRoot(c.ctx, c.args[i])
 	var mant big.Int
 	exp, err := x.MantExp(&mant)
@@ -520,7 +517,7 @@
 	return f
 }
 
-func (c *callCtxt) string(i int) string {
+func (c *CallCtxt) String(i int) string {
 	x := newValueRoot(c.ctx, c.args[i])
 	v, err := x.String()
 	if err != nil {
@@ -530,7 +527,7 @@
 	return v
 }
 
-func (c *callCtxt) bytes(i int) []byte {
+func (c *CallCtxt) Bytes(i int) []byte {
 	x := newValueRoot(c.ctx, c.args[i])
 	v, err := x.Bytes()
 	if err != nil {
@@ -540,7 +537,7 @@
 	return v
 }
 
-func (c *callCtxt) reader(i int) io.Reader {
+func (c *CallCtxt) Reader(i int) io.Reader {
 	x := newValueRoot(c.ctx, c.args[i])
 	// TODO: optimize for string and bytes cases
 	r, err := x.Reader()
@@ -551,7 +548,7 @@
 	return r
 }
 
-func (c *callCtxt) bool(i int) bool {
+func (c *CallCtxt) Bool(i int) bool {
 	x := newValueRoot(c.ctx, c.args[i])
 	b, err := x.Bool()
 	if err != nil {
@@ -561,7 +558,7 @@
 	return b
 }
 
-func (c *callCtxt) list(i int) (a []Value) {
+func (c *CallCtxt) List(i int) (a []Value) {
 	arg := c.args[i]
 	x := newValueRoot(c.ctx, arg)
 	v, err := x.List()
@@ -575,7 +572,7 @@
 	return a
 }
 
-func (c *callCtxt) iter(i int) (a Iterator) {
+func (c *CallCtxt) Iter(i int) (a Iterator) {
 	arg := c.args[i]
 	x := newValueRoot(c.ctx, arg)
 	v, err := x.List()
@@ -586,7 +583,7 @@
 	return v
 }
 
-func (c *callCtxt) decimalList(i int) (a []*apd.Decimal) {
+func (c *CallCtxt) DecimalList(i int) (a []*apd.Decimal) {
 	arg := c.args[i]
 	x := newValueRoot(c.ctx, arg)
 	v, err := x.List()
@@ -598,7 +595,7 @@
 		num, err := v.Value().getNum(numKind)
 		if err != nil {
 			c.errf(c.src, err, "invalid list element %d in argument %d to %s: %v",
-				j, i, c.name(), err)
+				j, i, c.Name(), err)
 			break
 		}
 		a = append(a, &num.X)
@@ -606,7 +603,7 @@
 	return a
 }
 
-func (c *callCtxt) strList(i int) (a []string) {
+func (c *CallCtxt) StringList(i int) (a []string) {
 	arg := c.args[i]
 	x := newValueRoot(c.ctx, arg)
 	v, err := x.List()
@@ -617,7 +614,7 @@
 	for j := 0; v.Next(); j++ {
 		str, err := v.Value().String()
 		if err != nil {
-			c.err = errors.Wrapf(err, c.Pos(),
+			c.Err = errors.Wrapf(err, c.Pos(),
 				"element %d of list argument %d", j, i)
 			break
 		}
diff --git a/cue/builtins.go b/cue/builtins.go
index 87ad902..90671fe 100644
--- a/cue/builtins.go
+++ b/cue/builtins.go
@@ -147,12 +147,12 @@
 	return true, nil
 }
 
-var builtinPackages = map[string]*builtinPkg{
+var builtinPackages = map[string]*Package{
 	// "": {
 	// 	native: []*builtin{},
 	// },
 	"crypto/md5": {
-		native: []*builtin{{
+		Native: []*Builtin{{
 			Name:  "Size",
 			Const: "16",
 		}, {
@@ -162,10 +162,10 @@
 			Name:   "Sum",
 			Params: []kind{bytesKind | stringKind},
 			Result: bytesKind | stringKind,
-			Func: func(c *callCtxt) {
-				data := c.bytes(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				data := c.Bytes(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						a := md5.Sum(data)
 						return a[:]
 					}()
@@ -174,7 +174,7 @@
 		}},
 	},
 	"crypto/sha1": {
-		native: []*builtin{{
+		Native: []*Builtin{{
 			Name:  "Size",
 			Const: "20",
 		}, {
@@ -184,10 +184,10 @@
 			Name:   "Sum",
 			Params: []kind{bytesKind | stringKind},
 			Result: bytesKind | stringKind,
-			Func: func(c *callCtxt) {
-				data := c.bytes(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				data := c.Bytes(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						a := sha1.Sum(data)
 						return a[:]
 					}()
@@ -196,7 +196,7 @@
 		}},
 	},
 	"crypto/sha256": {
-		native: []*builtin{{
+		Native: []*Builtin{{
 			Name:  "Size",
 			Const: "32",
 		}, {
@@ -209,10 +209,10 @@
 			Name:   "Sum256",
 			Params: []kind{bytesKind | stringKind},
 			Result: bytesKind | stringKind,
-			Func: func(c *callCtxt) {
-				data := c.bytes(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				data := c.Bytes(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						a := sha256.Sum256(data)
 						return a[:]
 					}()
@@ -222,10 +222,10 @@
 			Name:   "Sum224",
 			Params: []kind{bytesKind | stringKind},
 			Result: bytesKind | stringKind,
-			Func: func(c *callCtxt) {
-				data := c.bytes(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				data := c.Bytes(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						a := sha256.Sum224(data)
 						return a[:]
 					}()
@@ -234,7 +234,7 @@
 		}},
 	},
 	"crypto/sha512": {
-		native: []*builtin{{
+		Native: []*Builtin{{
 			Name:  "Size",
 			Const: "64",
 		}, {
@@ -253,10 +253,10 @@
 			Name:   "Sum512",
 			Params: []kind{bytesKind | stringKind},
 			Result: bytesKind | stringKind,
-			Func: func(c *callCtxt) {
-				data := c.bytes(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				data := c.Bytes(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						a := sha512.Sum512(data)
 						return a[:]
 					}()
@@ -266,10 +266,10 @@
 			Name:   "Sum384",
 			Params: []kind{bytesKind | stringKind},
 			Result: bytesKind | stringKind,
-			Func: func(c *callCtxt) {
-				data := c.bytes(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				data := c.Bytes(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						a := sha512.Sum384(data)
 						return a[:]
 					}()
@@ -279,10 +279,10 @@
 			Name:   "Sum512_224",
 			Params: []kind{bytesKind | stringKind},
 			Result: bytesKind | stringKind,
-			Func: func(c *callCtxt) {
-				data := c.bytes(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				data := c.Bytes(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						a := sha512.Sum512_224(data)
 						return a[:]
 					}()
@@ -292,10 +292,10 @@
 			Name:   "Sum512_256",
 			Params: []kind{bytesKind | stringKind},
 			Result: bytesKind | stringKind,
-			Func: func(c *callCtxt) {
-				data := c.bytes(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				data := c.Bytes(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						a := sha512.Sum512_256(data)
 						return a[:]
 					}()
@@ -304,14 +304,14 @@
 		}},
 	},
 	"encoding/base64": {
-		native: []*builtin{{
+		Native: []*Builtin{{
 			Name:   "EncodedLen",
 			Params: []kind{topKind, intKind},
 			Result: intKind,
-			Func: func(c *callCtxt) {
-				encoding, n := c.value(0), c.int(1)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				encoding, n := c.Value(0), c.Int(1)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						if err := encoding.Null(); err != nil {
 							return 0, fmt.Errorf("base64: unsupported encoding: %v", err)
 						}
@@ -323,10 +323,10 @@
 			Name:   "DecodedLen",
 			Params: []kind{topKind, intKind},
 			Result: intKind,
-			Func: func(c *callCtxt) {
-				encoding, x := c.value(0), c.int(1)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				encoding, x := c.Value(0), c.Int(1)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						if err := encoding.Null(); err != nil {
 							return 0, fmt.Errorf("base64: unsupported encoding: %v", err)
 						}
@@ -338,10 +338,10 @@
 			Name:   "Encode",
 			Params: []kind{topKind, bytesKind | stringKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				encoding, src := c.value(0), c.bytes(1)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				encoding, src := c.Value(0), c.Bytes(1)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						if err := encoding.Null(); err != nil {
 							return "", fmt.Errorf("base64: unsupported encoding: %v", err)
 						}
@@ -353,10 +353,10 @@
 			Name:   "Decode",
 			Params: []kind{topKind, stringKind},
 			Result: bytesKind | stringKind,
-			Func: func(c *callCtxt) {
-				encoding, s := c.value(0), c.string(1)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				encoding, s := c.Value(0), c.String(1)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						if err := encoding.Null(); err != nil {
 							return nil, fmt.Errorf("base64: unsupported encoding: %v", err)
 						}
@@ -367,14 +367,14 @@
 		}},
 	},
 	"encoding/csv": {
-		native: []*builtin{{
+		Native: []*Builtin{{
 			Name:   "Encode",
 			Params: []kind{topKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				x := c.value(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				x := c.Value(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						buf := &bytes.Buffer{}
 						w := csv.NewWriter(buf)
 						iter, err := x.List()
@@ -410,10 +410,10 @@
 			Name:   "Decode",
 			Params: []kind{bytesKind | stringKind},
 			Result: listKind,
-			Func: func(c *callCtxt) {
-				r := c.reader(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				r := c.Reader(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						return csv.NewReader(r).ReadAll()
 					}()
 				}
@@ -421,14 +421,14 @@
 		}},
 	},
 	"encoding/hex": {
-		native: []*builtin{{
+		Native: []*Builtin{{
 			Name:   "EncodedLen",
 			Params: []kind{intKind},
 			Result: intKind,
-			Func: func(c *callCtxt) {
-				n := c.int(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				n := c.Int(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return hex.EncodedLen(n)
 					}()
 				}
@@ -437,10 +437,10 @@
 			Name:   "DecodedLen",
 			Params: []kind{intKind},
 			Result: intKind,
-			Func: func(c *callCtxt) {
-				x := c.int(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				x := c.Int(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return hex.DecodedLen(x)
 					}()
 				}
@@ -449,10 +449,10 @@
 			Name:   "Decode",
 			Params: []kind{stringKind},
 			Result: bytesKind | stringKind,
-			Func: func(c *callCtxt) {
-				s := c.string(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				s := c.String(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						return hex.DecodeString(s)
 					}()
 				}
@@ -461,10 +461,10 @@
 			Name:   "Dump",
 			Params: []kind{bytesKind | stringKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				data := c.bytes(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				data := c.Bytes(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return hex.Dump(data)
 					}()
 				}
@@ -473,10 +473,10 @@
 			Name:   "Encode",
 			Params: []kind{bytesKind | stringKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				src := c.bytes(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				src := c.Bytes(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return hex.EncodeToString(src)
 					}()
 				}
@@ -484,14 +484,14 @@
 		}},
 	},
 	"encoding/json": {
-		native: []*builtin{{
+		Native: []*Builtin{{
 			Name:   "Valid",
 			Params: []kind{bytesKind | stringKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				data := c.bytes(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				data := c.Bytes(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return json.Valid(data)
 					}()
 				}
@@ -500,10 +500,10 @@
 			Name:   "Compact",
 			Params: []kind{bytesKind | stringKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				src := c.bytes(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				src := c.Bytes(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						dst := bytes.Buffer{}
 						if err := json.Compact(&dst, src); err != nil {
 							return "", err
@@ -516,10 +516,10 @@
 			Name:   "Indent",
 			Params: []kind{bytesKind | stringKind, stringKind, stringKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				src, prefix, indent := c.bytes(0), c.string(1), c.string(2)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				src, prefix, indent := c.Bytes(0), c.String(1), c.String(2)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						dst := bytes.Buffer{}
 						if err := json.Indent(&dst, src, prefix, indent); err != nil {
 							return "", err
@@ -532,10 +532,10 @@
 			Name:   "HTMLEscape",
 			Params: []kind{bytesKind | stringKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				src := c.bytes(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				src := c.Bytes(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						dst := &bytes.Buffer{}
 						json.HTMLEscape(dst, src)
 						return dst.String()
@@ -546,10 +546,10 @@
 			Name:   "Marshal",
 			Params: []kind{topKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				v := c.value(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				v := c.Value(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						b, err := json.Marshal(v)
 						return string(b), err
 					}()
@@ -559,10 +559,10 @@
 			Name:   "MarshalStream",
 			Params: []kind{topKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				v := c.value(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				v := c.Value(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 
 						iter, err := v.List()
 						if err != nil {
@@ -585,10 +585,10 @@
 			Name:   "Unmarshal",
 			Params: []kind{bytesKind | stringKind},
 			Result: topKind,
-			Func: func(c *callCtxt) {
-				b := c.bytes(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				b := c.Bytes(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						if !json.Valid(b) {
 							return nil, fmt.Errorf("json: invalid JSON")
 						}
@@ -605,10 +605,10 @@
 			Name:   "Validate",
 			Params: []kind{bytesKind | stringKind, topKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				b, v := c.bytes(0), c.value(1)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				b, v := c.Bytes(0), c.Value(1)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						if !json.Valid(b) {
 							return false, fmt.Errorf("json: invalid JSON")
 						}
@@ -631,14 +631,14 @@
 		}},
 	},
 	"encoding/yaml": {
-		native: []*builtin{{
+		Native: []*Builtin{{
 			Name:   "Marshal",
 			Params: []kind{topKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				v := c.value(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				v := c.Value(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						if err := v.Validate(Concrete(true)); err != nil {
 							if err := v.Validate(); err != nil {
 								return "", err
@@ -655,10 +655,10 @@
 			Name:   "MarshalStream",
 			Params: []kind{topKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				v := c.value(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				v := c.Value(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 
 						iter, err := v.List()
 						if err != nil {
@@ -691,10 +691,10 @@
 			Name:   "Unmarshal",
 			Params: []kind{bytesKind | stringKind},
 			Result: topKind,
-			Func: func(c *callCtxt) {
-				data := c.bytes(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				data := c.Bytes(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						return yaml.Unmarshal("", data)
 					}()
 				}
@@ -703,10 +703,10 @@
 			Name:   "Validate",
 			Params: []kind{bytesKind | stringKind, topKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				b, v := c.bytes(0), c.value(1)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				b, v := c.Bytes(0), c.Value(1)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						d, err := yaml.NewDecoder("yaml.Validate", b)
 						if err != nil {
 							return false, err
@@ -742,10 +742,10 @@
 			Name:   "ValidatePartial",
 			Params: []kind{bytesKind | stringKind, topKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				b, v := c.bytes(0), c.value(1)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				b, v := c.Bytes(0), c.Value(1)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						d, err := yaml.NewDecoder("yaml.ValidatePartial", b)
 						if err != nil {
 							return false, err
@@ -775,14 +775,14 @@
 		}},
 	},
 	"html": {
-		native: []*builtin{{
+		Native: []*Builtin{{
 			Name:   "Escape",
 			Params: []kind{stringKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				s := c.string(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				s := c.String(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return html.EscapeString(s)
 					}()
 				}
@@ -791,10 +791,10 @@
 			Name:   "Unescape",
 			Params: []kind{stringKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				s := c.string(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				s := c.String(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return html.UnescapeString(s)
 					}()
 				}
@@ -802,14 +802,14 @@
 		}},
 	},
 	"list": {
-		native: []*builtin{{
+		Native: []*Builtin{{
 			Name:   "Drop",
 			Params: []kind{listKind, intKind},
 			Result: listKind,
-			Func: func(c *callCtxt) {
-				x, n := c.list(0), c.int(1)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				x, n := c.List(0), c.Int(1)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						if n < 0 {
 							return nil, fmt.Errorf("negative index")
 						}
@@ -826,10 +826,10 @@
 			Name:   "FlattenN",
 			Params: []kind{topKind, intKind},
 			Result: listKind,
-			Func: func(c *callCtxt) {
-				xs, depth := c.value(0), c.int(1)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				xs, depth := c.Value(0), c.Int(1)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						var flattenN func(Value, int) ([]Value, error)
 						flattenN = func(xs Value, depth int) ([]Value, error) {
 							var res []Value
@@ -860,10 +860,10 @@
 			Name:   "Take",
 			Params: []kind{listKind, intKind},
 			Result: listKind,
-			Func: func(c *callCtxt) {
-				x, n := c.list(0), c.int(1)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				x, n := c.List(0), c.Int(1)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						if n < 0 {
 							return nil, fmt.Errorf("negative index")
 						}
@@ -880,10 +880,10 @@
 			Name:   "Slice",
 			Params: []kind{listKind, intKind, intKind},
 			Result: listKind,
-			Func: func(c *callCtxt) {
-				x, i, j := c.list(0), c.int(1), c.int(2)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				x, i, j := c.List(0), c.Int(1), c.Int(2)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						if i < 0 {
 							return nil, fmt.Errorf("negative index")
 						}
@@ -908,10 +908,10 @@
 			Name:   "MinItems",
 			Params: []kind{listKind, intKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				a, n := c.list(0), c.int(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				a, n := c.List(0), c.Int(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return len(a) >= n
 					}()
 				}
@@ -920,10 +920,10 @@
 			Name:   "MaxItems",
 			Params: []kind{listKind, intKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				a, n := c.list(0), c.int(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				a, n := c.List(0), c.Int(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return len(a) <= n
 					}()
 				}
@@ -932,10 +932,10 @@
 			Name:   "UniqueItems",
 			Params: []kind{listKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				a := c.list(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				a := c.List(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						b := []string{}
 						for _, v := range a {
 							b = append(b, fmt.Sprint(v))
@@ -954,10 +954,10 @@
 			Name:   "Contains",
 			Params: []kind{listKind, topKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				a, v := c.list(0), c.value(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				a, v := c.List(0), c.Value(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						for _, w := range a {
 							if v.Equals(w) {
 								return true
@@ -971,10 +971,10 @@
 			Name:   "Avg",
 			Params: []kind{listKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				xs := c.decimalList(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				xs := c.DecimalList(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						if 0 == len(xs) {
 							return nil, fmt.Errorf("empty list")
 						}
@@ -1001,10 +1001,10 @@
 			Name:   "Max",
 			Params: []kind{listKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				xs := c.decimalList(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				xs := c.DecimalList(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						if 0 == len(xs) {
 							return nil, fmt.Errorf("empty list")
 						}
@@ -1023,10 +1023,10 @@
 			Name:   "Min",
 			Params: []kind{listKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				xs := c.decimalList(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				xs := c.DecimalList(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						if 0 == len(xs) {
 							return nil, fmt.Errorf("empty list")
 						}
@@ -1045,10 +1045,10 @@
 			Name:   "Product",
 			Params: []kind{listKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				xs := c.decimalList(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				xs := c.DecimalList(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						d := apd.New(1, 0)
 						for _, x := range xs {
 							_, err := internal.BaseContext.Mul(d, x, d)
@@ -1064,10 +1064,10 @@
 			Name:   "Range",
 			Params: []kind{numKind, numKind, numKind},
 			Result: listKind,
-			Func: func(c *callCtxt) {
-				start, limit, step := c.decimal(0), c.decimal(1), c.decimal(2)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				start, limit, step := c.Decimal(0), c.Decimal(1), c.Decimal(2)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						if step.IsZero() {
 							return nil, fmt.Errorf("step must be non zero")
 						}
@@ -1107,10 +1107,10 @@
 			Name:   "Sum",
 			Params: []kind{listKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				xs := c.decimalList(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				xs := c.DecimalList(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						d := apd.New(0, 0)
 						for _, x := range xs {
 							_, err := internal.BaseContext.Add(d, x, d)
@@ -1126,10 +1126,10 @@
 			Name:   "Sort",
 			Params: []kind{listKind, topKind},
 			Result: listKind,
-			Func: func(c *callCtxt) {
-				list, cmp := c.list(0), c.value(1)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				list, cmp := c.List(0), c.Value(1)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						s := valueSorter{list, cmp, nil}
 
 						sort.Sort(&s)
@@ -1141,10 +1141,10 @@
 			Name:   "SortStable",
 			Params: []kind{listKind, topKind},
 			Result: listKind,
-			Func: func(c *callCtxt) {
-				list, cmp := c.list(0), c.value(1)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				list, cmp := c.List(0), c.Value(1)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						s := valueSorter{list, cmp, nil}
 						sort.Stable(&s)
 						return s.ret()
@@ -1155,10 +1155,10 @@
 			Name:   "SortStrings",
 			Params: []kind{listKind},
 			Result: listKind,
-			Func: func(c *callCtxt) {
-				a := c.strList(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				a := c.StringList(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						sort.Strings(a)
 						return a
 					}()
@@ -1168,10 +1168,10 @@
 			Name:   "IsSorted",
 			Params: []kind{listKind, topKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				list, cmp := c.list(0), c.value(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				list, cmp := c.List(0), c.Value(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						s := valueSorter{list, cmp, nil}
 						return sort.IsSorted(&s)
 					}()
@@ -1181,16 +1181,16 @@
 			Name:   "IsSortedStrings",
 			Params: []kind{listKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				a := c.strList(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				a := c.StringList(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return sort.StringsAreSorted(a)
 					}()
 				}
 			},
 		}},
-		cue: `{
+		CUE: `{
 	Comparer: {
 		T:    _
 		less: bool
@@ -1214,7 +1214,7 @@
 }`,
 	},
 	"math": {
-		native: []*builtin{{
+		Native: []*Builtin{{
 			Name:  "MaxExp",
 			Const: "2147483647",
 		}, {
@@ -1254,10 +1254,10 @@
 			Name:   "Jacobi",
 			Params: []kind{intKind, intKind},
 			Result: intKind,
-			Func: func(c *callCtxt) {
-				x, y := c.bigInt(0), c.bigInt(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				x, y := c.BigInt(0), c.BigInt(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return big.Jacobi(x, y)
 					}()
 				}
@@ -1269,10 +1269,10 @@
 			Name:   "Floor",
 			Params: []kind{numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x := c.decimal(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				x := c.Decimal(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						var d internal.Decimal
 						_, err := apdContext.Floor(&d, x)
 						return &d, err
@@ -1283,10 +1283,10 @@
 			Name:   "Ceil",
 			Params: []kind{numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x := c.decimal(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				x := c.Decimal(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						var d internal.Decimal
 						_, err := apdContext.Ceil(&d, x)
 						return &d, err
@@ -1297,10 +1297,10 @@
 			Name:   "Trunc",
 			Params: []kind{numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x := c.decimal(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				x := c.Decimal(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						var d internal.Decimal
 						_, err := roundTruncContext.RoundToIntegralExact(&d, x)
 						return &d, err
@@ -1311,10 +1311,10 @@
 			Name:   "Round",
 			Params: []kind{numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x := c.decimal(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				x := c.Decimal(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						var d internal.Decimal
 						_, err := roundUpContext.RoundToIntegralExact(&d, x)
 						return &d, err
@@ -1325,10 +1325,10 @@
 			Name:   "RoundToEven",
 			Params: []kind{numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x := c.decimal(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				x := c.Decimal(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						var d internal.Decimal
 						_, err := roundEvenContext.RoundToIntegralExact(&d, x)
 						return &d, err
@@ -1339,10 +1339,10 @@
 			Name:   "MultipleOf",
 			Params: []kind{numKind, numKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				x, y := c.decimal(0), c.decimal(1)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				x, y := c.Decimal(0), c.Decimal(1)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						var d apd.Decimal
 						cond, err := mulContext.Quo(&d, x, y)
 						return !cond.Inexact(), err
@@ -1353,10 +1353,10 @@
 			Name:   "Abs",
 			Params: []kind{numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x := c.decimal(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				x := c.Decimal(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						var d internal.Decimal
 						_, err := apdContext.Abs(&d, x)
 						return &d, err
@@ -1367,10 +1367,10 @@
 			Name:   "Acosh",
 			Params: []kind{numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x := c.float64(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				x := c.Float64(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return math.Acosh(x)
 					}()
 				}
@@ -1379,10 +1379,10 @@
 			Name:   "Asin",
 			Params: []kind{numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x := c.float64(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				x := c.Float64(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return math.Asin(x)
 					}()
 				}
@@ -1391,10 +1391,10 @@
 			Name:   "Acos",
 			Params: []kind{numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x := c.float64(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				x := c.Float64(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return math.Acos(x)
 					}()
 				}
@@ -1403,10 +1403,10 @@
 			Name:   "Asinh",
 			Params: []kind{numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x := c.float64(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				x := c.Float64(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return math.Asinh(x)
 					}()
 				}
@@ -1415,10 +1415,10 @@
 			Name:   "Atan",
 			Params: []kind{numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x := c.float64(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				x := c.Float64(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return math.Atan(x)
 					}()
 				}
@@ -1427,10 +1427,10 @@
 			Name:   "Atan2",
 			Params: []kind{numKind, numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				y, x := c.float64(0), c.float64(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				y, x := c.Float64(0), c.Float64(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return math.Atan2(y, x)
 					}()
 				}
@@ -1439,10 +1439,10 @@
 			Name:   "Atanh",
 			Params: []kind{numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x := c.float64(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				x := c.Float64(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return math.Atanh(x)
 					}()
 				}
@@ -1451,10 +1451,10 @@
 			Name:   "Cbrt",
 			Params: []kind{numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x := c.decimal(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				x := c.Decimal(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						var d internal.Decimal
 						_, err := apdContext.Cbrt(&d, x)
 						return &d, err
@@ -1498,10 +1498,10 @@
 			Name:   "Copysign",
 			Params: []kind{numKind, numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x, y := c.decimal(0), c.decimal(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				x, y := c.Decimal(0), c.Decimal(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						var d internal.Decimal
 						d.Set(x)
 						d.Negative = y.Negative
@@ -1513,10 +1513,10 @@
 			Name:   "Dim",
 			Params: []kind{numKind, numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x, y := c.decimal(0), c.decimal(1)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				x, y := c.Decimal(0), c.Decimal(1)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						var d internal.Decimal
 						_, err := apdContext.Sub(&d, x, y)
 						if err != nil {
@@ -1533,10 +1533,10 @@
 			Name:   "Erf",
 			Params: []kind{numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x := c.float64(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				x := c.Float64(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return math.Erf(x)
 					}()
 				}
@@ -1545,10 +1545,10 @@
 			Name:   "Erfc",
 			Params: []kind{numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x := c.float64(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				x := c.Float64(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return math.Erfc(x)
 					}()
 				}
@@ -1557,10 +1557,10 @@
 			Name:   "Erfinv",
 			Params: []kind{numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x := c.float64(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				x := c.Float64(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return math.Erfinv(x)
 					}()
 				}
@@ -1569,10 +1569,10 @@
 			Name:   "Erfcinv",
 			Params: []kind{numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x := c.float64(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				x := c.Float64(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return math.Erfcinv(x)
 					}()
 				}
@@ -1581,10 +1581,10 @@
 			Name:   "Exp",
 			Params: []kind{numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x := c.decimal(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				x := c.Decimal(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						var d internal.Decimal
 						_, err := apdContext.Exp(&d, x)
 						return &d, err
@@ -1595,10 +1595,10 @@
 			Name:   "Exp2",
 			Params: []kind{numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x := c.decimal(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				x := c.Decimal(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						var d internal.Decimal
 						_, err := apdContext.Pow(&d, two, x)
 						return &d, err
@@ -1609,10 +1609,10 @@
 			Name:   "Expm1",
 			Params: []kind{numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x := c.float64(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				x := c.Float64(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return math.Expm1(x)
 					}()
 				}
@@ -1621,10 +1621,10 @@
 			Name:   "Gamma",
 			Params: []kind{numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x := c.float64(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				x := c.Float64(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return math.Gamma(x)
 					}()
 				}
@@ -1633,10 +1633,10 @@
 			Name:   "Hypot",
 			Params: []kind{numKind, numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				p, q := c.float64(0), c.float64(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				p, q := c.Float64(0), c.Float64(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return math.Hypot(p, q)
 					}()
 				}
@@ -1645,10 +1645,10 @@
 			Name:   "J0",
 			Params: []kind{numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x := c.float64(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				x := c.Float64(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return math.J0(x)
 					}()
 				}
@@ -1657,10 +1657,10 @@
 			Name:   "Y0",
 			Params: []kind{numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x := c.float64(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				x := c.Float64(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return math.Y0(x)
 					}()
 				}
@@ -1669,10 +1669,10 @@
 			Name:   "J1",
 			Params: []kind{numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x := c.float64(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				x := c.Float64(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return math.J1(x)
 					}()
 				}
@@ -1681,10 +1681,10 @@
 			Name:   "Y1",
 			Params: []kind{numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x := c.float64(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				x := c.Float64(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return math.Y1(x)
 					}()
 				}
@@ -1693,10 +1693,10 @@
 			Name:   "Jn",
 			Params: []kind{intKind, numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				n, x := c.int(0), c.float64(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				n, x := c.Int(0), c.Float64(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return math.Jn(n, x)
 					}()
 				}
@@ -1705,10 +1705,10 @@
 			Name:   "Yn",
 			Params: []kind{intKind, numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				n, x := c.int(0), c.float64(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				n, x := c.Int(0), c.Float64(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return math.Yn(n, x)
 					}()
 				}
@@ -1717,10 +1717,10 @@
 			Name:   "Ldexp",
 			Params: []kind{numKind, intKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				frac, exp := c.float64(0), c.int(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				frac, exp := c.Float64(0), c.Int(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return math.Ldexp(frac, exp)
 					}()
 				}
@@ -1729,10 +1729,10 @@
 			Name:   "Log",
 			Params: []kind{numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x := c.decimal(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				x := c.Decimal(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						var d internal.Decimal
 						_, err := apdContext.Ln(&d, x)
 						return &d, err
@@ -1743,10 +1743,10 @@
 			Name:   "Log10",
 			Params: []kind{numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x := c.decimal(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				x := c.Decimal(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						var d internal.Decimal
 						_, err := apdContext.Log10(&d, x)
 						return &d, err
@@ -1757,10 +1757,10 @@
 			Name:   "Log2",
 			Params: []kind{numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x := c.decimal(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				x := c.Decimal(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						var d, ln2 internal.Decimal
 						_, _ = apdContext.Ln(&ln2, two)
 						_, err := apdContext.Ln(&d, x)
@@ -1776,10 +1776,10 @@
 			Name:   "Log1p",
 			Params: []kind{numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x := c.float64(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				x := c.Float64(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return math.Log1p(x)
 					}()
 				}
@@ -1788,10 +1788,10 @@
 			Name:   "Logb",
 			Params: []kind{numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x := c.float64(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				x := c.Float64(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return math.Logb(x)
 					}()
 				}
@@ -1800,10 +1800,10 @@
 			Name:   "Ilogb",
 			Params: []kind{numKind},
 			Result: intKind,
-			Func: func(c *callCtxt) {
-				x := c.float64(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				x := c.Float64(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return math.Ilogb(x)
 					}()
 				}
@@ -1812,10 +1812,10 @@
 			Name:   "Mod",
 			Params: []kind{numKind, numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x, y := c.float64(0), c.float64(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				x, y := c.Float64(0), c.Float64(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return math.Mod(x, y)
 					}()
 				}
@@ -1824,10 +1824,10 @@
 			Name:   "Pow",
 			Params: []kind{numKind, numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x, y := c.decimal(0), c.decimal(1)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				x, y := c.Decimal(0), c.Decimal(1)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						var d internal.Decimal
 						_, err := apdContext.Pow(&d, x, y)
 						return &d, err
@@ -1838,10 +1838,10 @@
 			Name:   "Pow10",
 			Params: []kind{intKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				n := c.int32(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				n := c.Int32(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return apd.New(1, n)
 					}()
 				}
@@ -1850,10 +1850,10 @@
 			Name:   "Remainder",
 			Params: []kind{numKind, numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x, y := c.float64(0), c.float64(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				x, y := c.Float64(0), c.Float64(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return math.Remainder(x, y)
 					}()
 				}
@@ -1862,10 +1862,10 @@
 			Name:   "Signbit",
 			Params: []kind{numKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				x := c.decimal(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				x := c.Decimal(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return x.Negative
 					}()
 				}
@@ -1874,10 +1874,10 @@
 			Name:   "Cos",
 			Params: []kind{numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x := c.float64(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				x := c.Float64(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return math.Cos(x)
 					}()
 				}
@@ -1886,10 +1886,10 @@
 			Name:   "Sin",
 			Params: []kind{numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x := c.float64(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				x := c.Float64(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return math.Sin(x)
 					}()
 				}
@@ -1898,10 +1898,10 @@
 			Name:   "Sinh",
 			Params: []kind{numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x := c.float64(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				x := c.Float64(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return math.Sinh(x)
 					}()
 				}
@@ -1910,10 +1910,10 @@
 			Name:   "Cosh",
 			Params: []kind{numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x := c.float64(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				x := c.Float64(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return math.Cosh(x)
 					}()
 				}
@@ -1922,10 +1922,10 @@
 			Name:   "Sqrt",
 			Params: []kind{numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x := c.float64(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				x := c.Float64(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return math.Sqrt(x)
 					}()
 				}
@@ -1934,10 +1934,10 @@
 			Name:   "Tan",
 			Params: []kind{numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x := c.float64(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				x := c.Float64(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return math.Tan(x)
 					}()
 				}
@@ -1946,10 +1946,10 @@
 			Name:   "Tanh",
 			Params: []kind{numKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				x := c.float64(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				x := c.Float64(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return math.Tanh(x)
 					}()
 				}
@@ -1957,14 +1957,14 @@
 		}},
 	},
 	"math/bits": {
-		native: []*builtin{{
+		Native: []*Builtin{{
 			Name:   "Lsh",
 			Params: []kind{intKind, intKind},
 			Result: intKind,
-			Func: func(c *callCtxt) {
-				x, n := c.bigInt(0), c.uint(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				x, n := c.BigInt(0), c.Uint(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						var z big.Int
 						z.Lsh(x, n)
 						return &z
@@ -1975,10 +1975,10 @@
 			Name:   "Rsh",
 			Params: []kind{intKind, intKind},
 			Result: intKind,
-			Func: func(c *callCtxt) {
-				x, n := c.bigInt(0), c.uint(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				x, n := c.BigInt(0), c.Uint(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						var z big.Int
 						z.Rsh(x, n)
 						return &z
@@ -1989,10 +1989,10 @@
 			Name:   "At",
 			Params: []kind{intKind, intKind},
 			Result: intKind,
-			Func: func(c *callCtxt) {
-				x, i := c.bigInt(0), c.uint(1)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				x, i := c.BigInt(0), c.Uint(1)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						if i > math.MaxInt32 {
 							return 0, fmt.Errorf("bit index too large")
 						}
@@ -2004,10 +2004,10 @@
 			Name:   "Set",
 			Params: []kind{intKind, intKind, intKind},
 			Result: intKind,
-			Func: func(c *callCtxt) {
-				x, i, bit := c.bigInt(0), c.int(1), c.uint(2)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				x, i, bit := c.BigInt(0), c.Int(1), c.Uint(2)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						var z big.Int
 						z.SetBit(x, i, bit)
 						return &z
@@ -2018,10 +2018,10 @@
 			Name:   "And",
 			Params: []kind{intKind, intKind},
 			Result: intKind,
-			Func: func(c *callCtxt) {
-				a, b := c.bigInt(0), c.bigInt(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				a, b := c.BigInt(0), c.BigInt(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						var z big.Int
 						z.And(a, b)
 						return &z
@@ -2032,10 +2032,10 @@
 			Name:   "Or",
 			Params: []kind{intKind, intKind},
 			Result: intKind,
-			Func: func(c *callCtxt) {
-				a, b := c.bigInt(0), c.bigInt(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				a, b := c.BigInt(0), c.BigInt(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						var z big.Int
 						z.Or(a, b)
 						return &z
@@ -2046,10 +2046,10 @@
 			Name:   "Xor",
 			Params: []kind{intKind, intKind},
 			Result: intKind,
-			Func: func(c *callCtxt) {
-				a, b := c.bigInt(0), c.bigInt(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				a, b := c.BigInt(0), c.BigInt(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						var z big.Int
 						z.Xor(a, b)
 						return &z
@@ -2060,10 +2060,10 @@
 			Name:   "Clear",
 			Params: []kind{intKind, intKind},
 			Result: intKind,
-			Func: func(c *callCtxt) {
-				a, b := c.bigInt(0), c.bigInt(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				a, b := c.BigInt(0), c.BigInt(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						var z big.Int
 						z.AndNot(a, b)
 						return &z
@@ -2074,10 +2074,10 @@
 			Name:   "OnesCount",
 			Params: []kind{intKind},
 			Result: intKind,
-			Func: func(c *callCtxt) {
-				x := c.bigInt(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				x := c.BigInt(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						var count int
 						for _, w := range x.Bits() {
 							count += bits.OnesCount64(uint64(w))
@@ -2090,10 +2090,10 @@
 			Name:   "Len",
 			Params: []kind{intKind},
 			Result: intKind,
-			Func: func(c *callCtxt) {
-				x := c.bigInt(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				x := c.BigInt(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return x.BitLen()
 					}()
 				}
@@ -2101,14 +2101,14 @@
 		}},
 	},
 	"net": {
-		native: []*builtin{{
+		Native: []*Builtin{{
 			Name:   "SplitHostPort",
 			Params: []kind{stringKind},
 			Result: listKind,
-			Func: func(c *callCtxt) {
-				s := c.string(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				s := c.String(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						host, port, err := net.SplitHostPort(s)
 						if err != nil {
 							return nil, err
@@ -2121,10 +2121,10 @@
 			Name:   "JoinHostPort",
 			Params: []kind{topKind, topKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				host, port := c.value(0), c.value(1)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				host, port := c.Value(0), c.Value(1)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						var err error
 						hostStr := ""
 						switch host.Kind() {
@@ -2170,10 +2170,10 @@
 			Name:   "FQDN",
 			Params: []kind{stringKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				s := c.string(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				s := c.String(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						for i := 0; i < len(s); i++ {
 							if s[i] >= utf8.RuneSelf {
 								return false
@@ -2194,10 +2194,10 @@
 			Name:   "ParseIP",
 			Params: []kind{stringKind},
 			Result: listKind,
-			Func: func(c *callCtxt) {
-				s := c.string(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				s := c.String(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						goip := net.ParseIP(s)
 						if goip == nil {
 							return nil, fmt.Errorf("invalid IP address %q", s)
@@ -2210,10 +2210,10 @@
 			Name:   "IPv4",
 			Params: []kind{topKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				ip := c.value(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				ip := c.Value(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 
 						return netGetIP(ip).To4() != nil
 					}()
@@ -2223,10 +2223,10 @@
 			Name:   "IP",
 			Params: []kind{topKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				ip := c.value(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				ip := c.Value(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 
 						return netGetIP(ip) != nil
 					}()
@@ -2236,10 +2236,10 @@
 			Name:   "LoopbackIP",
 			Params: []kind{topKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				ip := c.value(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				ip := c.Value(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return netGetIP(ip).IsLoopback()
 					}()
 				}
@@ -2248,10 +2248,10 @@
 			Name:   "MulticastIP",
 			Params: []kind{topKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				ip := c.value(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				ip := c.Value(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return netGetIP(ip).IsMulticast()
 					}()
 				}
@@ -2260,10 +2260,10 @@
 			Name:   "InterfaceLocalMulticastIP",
 			Params: []kind{topKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				ip := c.value(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				ip := c.Value(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return netGetIP(ip).IsInterfaceLocalMulticast()
 					}()
 				}
@@ -2272,10 +2272,10 @@
 			Name:   "LinkLocalMulticastIP",
 			Params: []kind{topKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				ip := c.value(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				ip := c.Value(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return netGetIP(ip).IsLinkLocalMulticast()
 					}()
 				}
@@ -2284,10 +2284,10 @@
 			Name:   "LinkLocalUnicastIP",
 			Params: []kind{topKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				ip := c.value(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				ip := c.Value(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return netGetIP(ip).IsLinkLocalUnicast()
 					}()
 				}
@@ -2296,10 +2296,10 @@
 			Name:   "GlobalUnicastIP",
 			Params: []kind{topKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				ip := c.value(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				ip := c.Value(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return netGetIP(ip).IsGlobalUnicast()
 					}()
 				}
@@ -2308,10 +2308,10 @@
 			Name:   "UnspecifiedIP",
 			Params: []kind{topKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				ip := c.value(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				ip := c.Value(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return netGetIP(ip).IsUnspecified()
 					}()
 				}
@@ -2320,10 +2320,10 @@
 			Name:   "ToIP4",
 			Params: []kind{topKind},
 			Result: listKind,
-			Func: func(c *callCtxt) {
-				ip := c.value(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				ip := c.Value(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						ipdata := netGetIP(ip)
 						if ipdata == nil {
 							return nil, fmt.Errorf("invalid IP %q", ip)
@@ -2340,10 +2340,10 @@
 			Name:   "ToIP16",
 			Params: []kind{topKind},
 			Result: listKind,
-			Func: func(c *callCtxt) {
-				ip := c.value(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				ip := c.Value(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						ipdata := netGetIP(ip)
 						if ipdata == nil {
 							return nil, fmt.Errorf("invalid IP %q", ip)
@@ -2356,10 +2356,10 @@
 			Name:   "IPString",
 			Params: []kind{topKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				ip := c.value(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				ip := c.Value(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						ipdata := netGetIP(ip)
 						if ipdata == nil {
 							return "", fmt.Errorf("invalid IP %q", ip)
@@ -2371,14 +2371,14 @@
 		}},
 	},
 	"path": {
-		native: []*builtin{{
+		Native: []*Builtin{{
 			Name:   "Split",
 			Params: []kind{stringKind},
 			Result: listKind,
-			Func: func(c *callCtxt) {
-				path := c.string(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				path := c.String(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						file, dir := split(path)
 						return []string{file, dir}
 					}()
@@ -2388,10 +2388,10 @@
 			Name:   "Match",
 			Params: []kind{stringKind, stringKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				pattern, name := c.string(0), c.string(1)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				pattern, name := c.String(0), c.String(1)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						return path.Match(pattern, name)
 					}()
 				}
@@ -2400,10 +2400,10 @@
 			Name:   "Clean",
 			Params: []kind{stringKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				path := c.string(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				path := c.String(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return pathClean(path)
 					}()
 				}
@@ -2412,10 +2412,10 @@
 			Name:   "Ext",
 			Params: []kind{stringKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				path := c.string(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				path := c.String(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return pathExt(path)
 					}()
 				}
@@ -2424,10 +2424,10 @@
 			Name:   "Base",
 			Params: []kind{stringKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				path := c.string(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				path := c.String(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return pathBase(path)
 					}()
 				}
@@ -2436,10 +2436,10 @@
 			Name:   "IsAbs",
 			Params: []kind{stringKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				path := c.string(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				path := c.String(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return pathIsAbs(path)
 					}()
 				}
@@ -2448,10 +2448,10 @@
 			Name:   "Dir",
 			Params: []kind{stringKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				path := c.string(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				path := c.String(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return pathDir(path)
 					}()
 				}
@@ -2459,14 +2459,14 @@
 		}},
 	},
 	"regexp": {
-		native: []*builtin{{
+		Native: []*Builtin{{
 			Name:   "Valid",
 			Params: []kind{stringKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				pattern := c.string(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				pattern := c.String(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						_, err := regexp.Compile(pattern)
 						return err == nil, err
 					}()
@@ -2476,10 +2476,10 @@
 			Name:   "Find",
 			Params: []kind{stringKind, stringKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				pattern, s := c.string(0), c.string(1)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				pattern, s := c.String(0), c.String(1)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						re, err := regexp.Compile(pattern)
 						if err != nil {
 							return "", err
@@ -2496,10 +2496,10 @@
 			Name:   "FindAll",
 			Params: []kind{stringKind, stringKind, intKind},
 			Result: listKind,
-			Func: func(c *callCtxt) {
-				pattern, s, n := c.string(0), c.string(1), c.int(2)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				pattern, s, n := c.String(0), c.String(1), c.Int(2)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						re, err := regexp.Compile(pattern)
 						if err != nil {
 							return nil, err
@@ -2516,10 +2516,10 @@
 			Name:   "FindSubmatch",
 			Params: []kind{stringKind, stringKind},
 			Result: listKind,
-			Func: func(c *callCtxt) {
-				pattern, s := c.string(0), c.string(1)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				pattern, s := c.String(0), c.String(1)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						re, err := regexp.Compile(pattern)
 						if err != nil {
 							return nil, err
@@ -2536,10 +2536,10 @@
 			Name:   "FindAllSubmatch",
 			Params: []kind{stringKind, stringKind, intKind},
 			Result: listKind,
-			Func: func(c *callCtxt) {
-				pattern, s, n := c.string(0), c.string(1), c.int(2)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				pattern, s, n := c.String(0), c.String(1), c.Int(2)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						re, err := regexp.Compile(pattern)
 						if err != nil {
 							return nil, err
@@ -2556,10 +2556,10 @@
 			Name:   "FindNamedSubmatch",
 			Params: []kind{stringKind, stringKind},
 			Result: structKind,
-			Func: func(c *callCtxt) {
-				pattern, s := c.string(0), c.string(1)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				pattern, s := c.String(0), c.String(1)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						re, err := regexp.Compile(pattern)
 						if err != nil {
 							return nil, err
@@ -2586,10 +2586,10 @@
 			Name:   "FindAllNamedSubmatch",
 			Params: []kind{stringKind, stringKind, intKind},
 			Result: listKind,
-			Func: func(c *callCtxt) {
-				pattern, s, n := c.string(0), c.string(1), c.int(2)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				pattern, s, n := c.String(0), c.String(1), c.Int(2)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						re, err := regexp.Compile(pattern)
 						if err != nil {
 							return nil, err
@@ -2620,10 +2620,10 @@
 			Name:   "Match",
 			Params: []kind{stringKind, stringKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				pattern, s := c.string(0), c.string(1)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				pattern, s := c.String(0), c.String(1)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						return regexp.MatchString(pattern, s)
 					}()
 				}
@@ -2632,10 +2632,10 @@
 			Name:   "QuoteMeta",
 			Params: []kind{stringKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				s := c.string(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				s := c.String(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return regexp.QuoteMeta(s)
 					}()
 				}
@@ -2643,14 +2643,14 @@
 		}},
 	},
 	"strconv": {
-		native: []*builtin{{
+		Native: []*Builtin{{
 			Name:   "Unquote",
 			Params: []kind{stringKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				s := c.string(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				s := c.String(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						return literal.Unquote(s)
 					}()
 				}
@@ -2659,10 +2659,10 @@
 			Name:   "ParseBool",
 			Params: []kind{stringKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				str := c.string(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				str := c.String(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						return strconv.ParseBool(str)
 					}()
 				}
@@ -2671,10 +2671,10 @@
 			Name:   "FormatBool",
 			Params: []kind{boolKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				b := c.bool(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				b := c.Bool(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return strconv.FormatBool(b)
 					}()
 				}
@@ -2683,10 +2683,10 @@
 			Name:   "ParseFloat",
 			Params: []kind{stringKind, intKind},
 			Result: numKind,
-			Func: func(c *callCtxt) {
-				s, bitSize := c.string(0), c.int(1)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				s, bitSize := c.String(0), c.Int(1)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						return strconv.ParseFloat(s, bitSize)
 					}()
 				}
@@ -2698,10 +2698,10 @@
 			Name:   "ParseUint",
 			Params: []kind{stringKind, intKind, intKind},
 			Result: intKind,
-			Func: func(c *callCtxt) {
-				s, base, bitSize := c.string(0), c.int(1), c.int(2)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				s, base, bitSize := c.String(0), c.Int(1), c.Int(2)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						return strconv.ParseUint(s, base, bitSize)
 					}()
 				}
@@ -2710,10 +2710,10 @@
 			Name:   "ParseInt",
 			Params: []kind{stringKind, intKind, intKind},
 			Result: intKind,
-			Func: func(c *callCtxt) {
-				s, base, bitSize := c.string(0), c.int(1), c.int(2)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				s, base, bitSize := c.String(0), c.Int(1), c.Int(2)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						return strconv.ParseInt(s, base, bitSize)
 					}()
 				}
@@ -2722,10 +2722,10 @@
 			Name:   "Atoi",
 			Params: []kind{stringKind},
 			Result: intKind,
-			Func: func(c *callCtxt) {
-				s := c.string(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				s := c.String(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						return strconv.Atoi(s)
 					}()
 				}
@@ -2734,10 +2734,10 @@
 			Name:   "FormatFloat",
 			Params: []kind{numKind, intKind, intKind, intKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				f, fmt, prec, bitSize := c.float64(0), c.byte(1), c.int(2), c.int(3)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				f, fmt, prec, bitSize := c.Float64(0), c.Byte(1), c.Int(2), c.Int(3)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return strconv.FormatFloat(f, fmt, prec, bitSize)
 					}()
 				}
@@ -2746,10 +2746,10 @@
 			Name:   "FormatUint",
 			Params: []kind{intKind, intKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				i, base := c.uint64(0), c.int(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				i, base := c.Uint64(0), c.Int(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return strconv.FormatUint(i, base)
 					}()
 				}
@@ -2758,10 +2758,10 @@
 			Name:   "FormatInt",
 			Params: []kind{intKind, intKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				i, base := c.int64(0), c.int(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				i, base := c.Int64(0), c.Int(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return strconv.FormatInt(i, base)
 					}()
 				}
@@ -2770,10 +2770,10 @@
 			Name:   "Quote",
 			Params: []kind{stringKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				s := c.string(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				s := c.String(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return strconv.Quote(s)
 					}()
 				}
@@ -2782,10 +2782,10 @@
 			Name:   "QuoteToASCII",
 			Params: []kind{stringKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				s := c.string(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				s := c.String(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return strconv.QuoteToASCII(s)
 					}()
 				}
@@ -2794,10 +2794,10 @@
 			Name:   "QuoteToGraphic",
 			Params: []kind{stringKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				s := c.string(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				s := c.String(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return strconv.QuoteToGraphic(s)
 					}()
 				}
@@ -2806,10 +2806,10 @@
 			Name:   "QuoteRune",
 			Params: []kind{intKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				r := c.rune(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				r := c.Rune(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return strconv.QuoteRune(r)
 					}()
 				}
@@ -2818,10 +2818,10 @@
 			Name:   "QuoteRuneToASCII",
 			Params: []kind{intKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				r := c.rune(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				r := c.Rune(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return strconv.QuoteRuneToASCII(r)
 					}()
 				}
@@ -2830,10 +2830,10 @@
 			Name:   "QuoteRuneToGraphic",
 			Params: []kind{intKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				r := c.rune(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				r := c.Rune(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return strconv.QuoteRuneToGraphic(r)
 					}()
 				}
@@ -2842,10 +2842,10 @@
 			Name:   "IsPrint",
 			Params: []kind{intKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				r := c.rune(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				r := c.Rune(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return strconv.IsPrint(r)
 					}()
 				}
@@ -2854,10 +2854,10 @@
 			Name:   "IsGraphic",
 			Params: []kind{intKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				r := c.rune(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				r := c.Rune(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return strconv.IsGraphic(r)
 					}()
 				}
@@ -2865,14 +2865,14 @@
 		}},
 	},
 	"strings": {
-		native: []*builtin{{
+		Native: []*Builtin{{
 			Name:   "ByteAt",
 			Params: []kind{bytesKind | stringKind, intKind},
 			Result: intKind,
-			Func: func(c *callCtxt) {
-				b, i := c.bytes(0), c.int(1)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				b, i := c.Bytes(0), c.Int(1)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						if i < 0 || i >= len(b) {
 							return 0, fmt.Errorf("index out of range")
 						}
@@ -2884,10 +2884,10 @@
 			Name:   "ByteSlice",
 			Params: []kind{bytesKind | stringKind, intKind, intKind},
 			Result: bytesKind | stringKind,
-			Func: func(c *callCtxt) {
-				b, start, end := c.bytes(0), c.int(1), c.int(2)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				b, start, end := c.Bytes(0), c.Int(1), c.Int(2)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						if start < 0 || start > end || end > len(b) {
 							return nil, fmt.Errorf("index out of range")
 						}
@@ -2899,10 +2899,10 @@
 			Name:   "Runes",
 			Params: []kind{stringKind},
 			Result: listKind,
-			Func: func(c *callCtxt) {
-				s := c.string(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				s := c.String(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return []rune(s)
 					}()
 				}
@@ -2911,10 +2911,10 @@
 			Name:   "MinRunes",
 			Params: []kind{stringKind, intKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				s, min := c.string(0), c.int(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				s, min := c.String(0), c.Int(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 
 						return len([]rune(s)) >= min
 					}()
@@ -2924,10 +2924,10 @@
 			Name:   "MaxRunes",
 			Params: []kind{stringKind, intKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				s, max := c.string(0), c.int(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				s, max := c.String(0), c.Int(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 
 						return len([]rune(s)) <= max
 					}()
@@ -2937,10 +2937,10 @@
 			Name:   "ToTitle",
 			Params: []kind{stringKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				s := c.string(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				s := c.String(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 
 						prev := ' '
 						return strings.Map(
@@ -2960,10 +2960,10 @@
 			Name:   "ToCamel",
 			Params: []kind{stringKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				s := c.string(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				s := c.String(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 
 						prev := ' '
 						return strings.Map(
@@ -2983,10 +2983,10 @@
 			Name:   "SliceRunes",
 			Params: []kind{stringKind, intKind, intKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				s, start, end := c.string(0), c.int(1), c.int(2)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				s, start, end := c.String(0), c.Int(1), c.Int(2)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						runes := []rune(s)
 						if start < 0 || start > end || end > len(runes) {
 							return "", fmt.Errorf("index out of range")
@@ -2999,10 +2999,10 @@
 			Name:   "Compare",
 			Params: []kind{stringKind, stringKind},
 			Result: intKind,
-			Func: func(c *callCtxt) {
-				a, b := c.string(0), c.string(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				a, b := c.String(0), c.String(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return strings.Compare(a, b)
 					}()
 				}
@@ -3011,10 +3011,10 @@
 			Name:   "Count",
 			Params: []kind{stringKind, stringKind},
 			Result: intKind,
-			Func: func(c *callCtxt) {
-				s, substr := c.string(0), c.string(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				s, substr := c.String(0), c.String(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return strings.Count(s, substr)
 					}()
 				}
@@ -3023,10 +3023,10 @@
 			Name:   "Contains",
 			Params: []kind{stringKind, stringKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				s, substr := c.string(0), c.string(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				s, substr := c.String(0), c.String(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return strings.Contains(s, substr)
 					}()
 				}
@@ -3035,10 +3035,10 @@
 			Name:   "ContainsAny",
 			Params: []kind{stringKind, stringKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				s, chars := c.string(0), c.string(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				s, chars := c.String(0), c.String(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return strings.ContainsAny(s, chars)
 					}()
 				}
@@ -3047,10 +3047,10 @@
 			Name:   "LastIndex",
 			Params: []kind{stringKind, stringKind},
 			Result: intKind,
-			Func: func(c *callCtxt) {
-				s, substr := c.string(0), c.string(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				s, substr := c.String(0), c.String(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return strings.LastIndex(s, substr)
 					}()
 				}
@@ -3059,10 +3059,10 @@
 			Name:   "IndexAny",
 			Params: []kind{stringKind, stringKind},
 			Result: intKind,
-			Func: func(c *callCtxt) {
-				s, chars := c.string(0), c.string(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				s, chars := c.String(0), c.String(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return strings.IndexAny(s, chars)
 					}()
 				}
@@ -3071,10 +3071,10 @@
 			Name:   "LastIndexAny",
 			Params: []kind{stringKind, stringKind},
 			Result: intKind,
-			Func: func(c *callCtxt) {
-				s, chars := c.string(0), c.string(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				s, chars := c.String(0), c.String(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return strings.LastIndexAny(s, chars)
 					}()
 				}
@@ -3083,10 +3083,10 @@
 			Name:   "SplitN",
 			Params: []kind{stringKind, stringKind, intKind},
 			Result: listKind,
-			Func: func(c *callCtxt) {
-				s, sep, n := c.string(0), c.string(1), c.int(2)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				s, sep, n := c.String(0), c.String(1), c.Int(2)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return strings.SplitN(s, sep, n)
 					}()
 				}
@@ -3095,10 +3095,10 @@
 			Name:   "SplitAfterN",
 			Params: []kind{stringKind, stringKind, intKind},
 			Result: listKind,
-			Func: func(c *callCtxt) {
-				s, sep, n := c.string(0), c.string(1), c.int(2)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				s, sep, n := c.String(0), c.String(1), c.Int(2)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return strings.SplitAfterN(s, sep, n)
 					}()
 				}
@@ -3107,10 +3107,10 @@
 			Name:   "Split",
 			Params: []kind{stringKind, stringKind},
 			Result: listKind,
-			Func: func(c *callCtxt) {
-				s, sep := c.string(0), c.string(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				s, sep := c.String(0), c.String(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return strings.Split(s, sep)
 					}()
 				}
@@ -3119,10 +3119,10 @@
 			Name:   "SplitAfter",
 			Params: []kind{stringKind, stringKind},
 			Result: listKind,
-			Func: func(c *callCtxt) {
-				s, sep := c.string(0), c.string(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				s, sep := c.String(0), c.String(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return strings.SplitAfter(s, sep)
 					}()
 				}
@@ -3131,10 +3131,10 @@
 			Name:   "Fields",
 			Params: []kind{stringKind},
 			Result: listKind,
-			Func: func(c *callCtxt) {
-				s := c.string(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				s := c.String(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return strings.Fields(s)
 					}()
 				}
@@ -3143,10 +3143,10 @@
 			Name:   "Join",
 			Params: []kind{listKind, stringKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				elems, sep := c.strList(0), c.string(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				elems, sep := c.StringList(0), c.String(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return strings.Join(elems, sep)
 					}()
 				}
@@ -3155,10 +3155,10 @@
 			Name:   "HasPrefix",
 			Params: []kind{stringKind, stringKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				s, prefix := c.string(0), c.string(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				s, prefix := c.String(0), c.String(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return strings.HasPrefix(s, prefix)
 					}()
 				}
@@ -3167,10 +3167,10 @@
 			Name:   "HasSuffix",
 			Params: []kind{stringKind, stringKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				s, suffix := c.string(0), c.string(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				s, suffix := c.String(0), c.String(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return strings.HasSuffix(s, suffix)
 					}()
 				}
@@ -3179,10 +3179,10 @@
 			Name:   "Repeat",
 			Params: []kind{stringKind, intKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				s, count := c.string(0), c.int(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				s, count := c.String(0), c.Int(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return strings.Repeat(s, count)
 					}()
 				}
@@ -3191,10 +3191,10 @@
 			Name:   "ToUpper",
 			Params: []kind{stringKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				s := c.string(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				s := c.String(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return strings.ToUpper(s)
 					}()
 				}
@@ -3203,10 +3203,10 @@
 			Name:   "ToLower",
 			Params: []kind{stringKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				s := c.string(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				s := c.String(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return strings.ToLower(s)
 					}()
 				}
@@ -3215,10 +3215,10 @@
 			Name:   "Trim",
 			Params: []kind{stringKind, stringKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				s, cutset := c.string(0), c.string(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				s, cutset := c.String(0), c.String(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return strings.Trim(s, cutset)
 					}()
 				}
@@ -3227,10 +3227,10 @@
 			Name:   "TrimLeft",
 			Params: []kind{stringKind, stringKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				s, cutset := c.string(0), c.string(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				s, cutset := c.String(0), c.String(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return strings.TrimLeft(s, cutset)
 					}()
 				}
@@ -3239,10 +3239,10 @@
 			Name:   "TrimRight",
 			Params: []kind{stringKind, stringKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				s, cutset := c.string(0), c.string(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				s, cutset := c.String(0), c.String(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return strings.TrimRight(s, cutset)
 					}()
 				}
@@ -3251,10 +3251,10 @@
 			Name:   "TrimSpace",
 			Params: []kind{stringKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				s := c.string(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				s := c.String(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return strings.TrimSpace(s)
 					}()
 				}
@@ -3263,10 +3263,10 @@
 			Name:   "TrimPrefix",
 			Params: []kind{stringKind, stringKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				s, prefix := c.string(0), c.string(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				s, prefix := c.String(0), c.String(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return strings.TrimPrefix(s, prefix)
 					}()
 				}
@@ -3275,10 +3275,10 @@
 			Name:   "TrimSuffix",
 			Params: []kind{stringKind, stringKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				s, suffix := c.string(0), c.string(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				s, suffix := c.String(0), c.String(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return strings.TrimSuffix(s, suffix)
 					}()
 				}
@@ -3287,10 +3287,10 @@
 			Name:   "Replace",
 			Params: []kind{stringKind, stringKind, stringKind, intKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				s, old, new, n := c.string(0), c.string(1), c.string(2), c.int(3)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				s, old, new, n := c.String(0), c.String(1), c.String(2), c.Int(3)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return strings.Replace(s, old, new, n)
 					}()
 				}
@@ -3299,10 +3299,10 @@
 			Name:   "Index",
 			Params: []kind{stringKind, stringKind},
 			Result: intKind,
-			Func: func(c *callCtxt) {
-				s, substr := c.string(0), c.string(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				s, substr := c.String(0), c.String(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return strings.Index(s, substr)
 					}()
 				}
@@ -3310,14 +3310,14 @@
 		}},
 	},
 	"struct": {
-		native: []*builtin{{
+		Native: []*Builtin{{
 			Name:   "MinFields",
 			Params: []kind{structKind, intKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				object, n := c.structVal(0), c.int(1)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				object, n := c.Struct(0), c.Int(1)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						iter := object.Fields(Hidden(false), Optional(false))
 						count := 0
 						for iter.Next() {
@@ -3331,10 +3331,10 @@
 			Name:   "MaxFields",
 			Params: []kind{structKind, intKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				object, n := c.structVal(0), c.int(1)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				object, n := c.Struct(0), c.Int(1)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						iter := object.Fields(Hidden(false), Optional(false))
 						count := 0
 						for iter.Next() {
@@ -3347,14 +3347,14 @@
 		}},
 	},
 	"text/tabwriter": {
-		native: []*builtin{{
+		Native: []*Builtin{{
 			Name:   "Write",
 			Params: []kind{topKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				data := c.value(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				data := c.Value(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						buf := &bytes.Buffer{}
 						tw := tabwriter.NewWriter(buf, 0, 4, 1, ' ', 0)
 
@@ -3394,14 +3394,14 @@
 		}},
 	},
 	"text/template": {
-		native: []*builtin{{
+		Native: []*Builtin{{
 			Name:   "Execute",
 			Params: []kind{stringKind, topKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				templ, data := c.string(0), c.value(1)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				templ, data := c.String(0), c.Value(1)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						t, err := template.New("").Parse(templ)
 						if err != nil {
 							return "", err
@@ -3422,10 +3422,10 @@
 			Name:   "HTMLEscape",
 			Params: []kind{stringKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				s := c.string(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				s := c.String(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return template.HTMLEscapeString(s)
 					}()
 				}
@@ -3434,10 +3434,10 @@
 			Name:   "JSEscape",
 			Params: []kind{stringKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				s := c.string(0)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				s := c.String(0)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						return template.JSEscapeString(s)
 					}()
 				}
@@ -3445,7 +3445,7 @@
 		}},
 	},
 	"time": {
-		native: []*builtin{{
+		Native: []*Builtin{{
 			Name:  "Nanosecond",
 			Const: "1",
 		}, {
@@ -3467,10 +3467,10 @@
 			Name:   "Duration",
 			Params: []kind{stringKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				s := c.string(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				s := c.String(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						if _, err := time.ParseDuration(s); err != nil {
 							return false, err
 						}
@@ -3482,10 +3482,10 @@
 			Name:   "ParseDuration",
 			Params: []kind{stringKind},
 			Result: intKind,
-			Func: func(c *callCtxt) {
-				s := c.string(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				s := c.String(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						d, err := time.ParseDuration(s)
 						if err != nil {
 							return 0, err
@@ -3594,10 +3594,10 @@
 			Name:   "Time",
 			Params: []kind{stringKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				s := c.string(0)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				s := c.String(0)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						return timeFormat(s, time.RFC3339Nano)
 					}()
 				}
@@ -3606,10 +3606,10 @@
 			Name:   "Format",
 			Params: []kind{stringKind, stringKind},
 			Result: boolKind,
-			Func: func(c *callCtxt) {
-				value, layout := c.string(0), c.string(1)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				value, layout := c.String(0), c.String(1)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						return timeFormat(value, layout)
 					}()
 				}
@@ -3618,10 +3618,10 @@
 			Name:   "Parse",
 			Params: []kind{stringKind, stringKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				layout, value := c.string(0), c.string(1)
-				if c.do() {
-					c.ret, c.err = func() (interface{}, error) {
+			Func: func(c *CallCtxt) {
+				layout, value := c.String(0), c.String(1)
+				if c.Do() {
+					c.Ret, c.Err = func() (interface{}, error) {
 						t, err := time.Parse(layout, value)
 						if err != nil {
 							return "", err
@@ -3634,10 +3634,10 @@
 			Name:   "Unix",
 			Params: []kind{intKind, intKind},
 			Result: stringKind,
-			Func: func(c *callCtxt) {
-				sec, nsec := c.int64(0), c.int64(1)
-				if c.do() {
-					c.ret = func() interface{} {
+			Func: func(c *CallCtxt) {
+				sec, nsec := c.Int64(0), c.Int64(1)
+				if c.Do() {
+					c.Ret = func() interface{} {
 						t := time.Unix(sec, nsec)
 						return t.UTC().Format(time.RFC3339Nano)
 					}()
@@ -3646,8 +3646,8 @@
 		}},
 	},
 	"tool": {
-		native: []*builtin{},
-		cue: `{
+		Native: []*Builtin{},
+		CUE: `{
 	Command: {
 		$usage?: string
 		$short?: string
@@ -3666,8 +3666,8 @@
 }`,
 	},
 	"tool/cli": {
-		native: []*builtin{},
-		cue: `{
+		Native: []*Builtin{},
+		CUE: `{
 	Print: {
 		$id:  *"tool/cli.Print" | "print"
 		text: string
@@ -3675,8 +3675,8 @@
 }`,
 	},
 	"tool/exec": {
-		native: []*builtin{},
-		cue: `{
+		Native: []*Builtin{},
+		CUE: `{
 	Run: {
 		$id: *"tool/exec.Run" | "exec"
 		cmd: string | [string, ...string]
@@ -3691,8 +3691,8 @@
 }`,
 	},
 	"tool/file": {
-		native: []*builtin{},
-		cue: `{
+		Native: []*Builtin{},
+		CUE: `{
 	Read: {
 		$id:      "tool/file.Read"
 		filename: !=""
@@ -3718,8 +3718,8 @@
 }`,
 	},
 	"tool/http": {
-		native: []*builtin{},
-		cue: `{
+		Native: []*Builtin{},
+		CUE: `{
 	Get: Do & {
 		method: "GET"
 	}
@@ -3760,8 +3760,8 @@
 }`,
 	},
 	"tool/os": {
-		native: []*builtin{},
-		cue: `{
+		Native: []*Builtin{},
+		CUE: `{
 	Name:  !="" & !~"^[$]"
 	Value: bool | number | *string | null
 	Setenv: {