Documentation ¶
Index ¶
- Variables
- type Boolean
- type Break
- type Builtin
- type Class
- type Closure
- type Continue
- type Env
- type Error
- type Float
- type Function
- type GetSetter
- type Getter
- type Hashable
- type Integer
- type KeyHash
- type List
- type Map
- type MapGetSetter
- type MapGetter
- type MapPair
- type MapSetter
- type NativeModule
- type NativeStruct
- type Null
- type Object
- func NewBoolean(b bool) Object
- func NewBreak() Object
- func NewClass() Object
- func NewContinue() Object
- func NewError(f string, a ...interface{}) Object
- func NewFloat(f float64) Object
- func NewFunction(params []string, env *Env, body interface{}) Object
- func NewFunctionCompiled(i code.Instructions, nLocals, nParams int) Object
- func NewGetSetter(s MapGetSetter, n string) Object
- func NewInteger(i int64) Object
- func NewList(elems ...Object) Object
- func NewNativeModule(name string) Object
- func NewNativeStruct(s interface{}) Object
- func NewNull() Object
- func NewReturn(o Object) Object
- func NewString(s string) Object
- func ParseBool(b bool) Object
- func Unwrap(o Object) Object
- type Return
- type Setter
- type String
- type Type
Constants ¶
This section is empty.
Variables ¶
View Source
var ( NullObj = NewNull() True = NewBoolean(true) False = NewBoolean(false) ContinueObj = NewContinue() BreakObj = NewBreak() )
View Source
var Builtins = []struct { Name string Builtin Builtin }{ { "len", func(args ...Object) Object { if l := len(args); l != 1 { return NewError("len: wrong number of arguments, expected 1, got %d", l) } switch o := args[0].(type) { case List: return NewInteger(int64(len(o))) case *String: return NewInteger(int64(len(*o))) default: return NewError("len: object of type %q has no length", o.Type()) } }, }, { "native", func(args ...Object) Object { if l := len(args); l != 1 { return NewError("native: wrong number of arguments, expected 1, got %d", l) } str, ok := args[0].(*String) if !ok { return NewError("native: first argument must be a string, got %s instead", args[0].Type()) } return NewNativeModule(str.String()) }, }, { "println", func(args ...Object) Object { var arguments []interface{} for _, a := range args { arguments = append(arguments, a.String()) } fmt.Fprintln(Stdout, arguments...) return NullObj }, }, { "print", func(args ...Object) Object { var arguments []interface{} for _, a := range args { arguments = append(arguments, a.String()) } fmt.Fprint(Stdout, arguments...) return NullObj }, }, { "input", func(args ...Object) Object { var tmp string switch l := len(args); l { case 0: fmt.Scanln(&tmp) case 1: fmt.Print(args[0]) fmt.Scanln(&tmp) default: return NewError("input: wrong number of arguments, expected 1, got %d", l) } return NewString(tmp) }, }, { "string", func(args ...Object) Object { var buf strings.Builder for _, a := range args { buf.WriteString(a.String()) } return NewString(buf.String()) }, }, { "int", func(args ...Object) Object { if l := len(args); l != 1 { return NewError("int: wrong number of arguments, expected 1, got %d", l) } switch o := args[0].(type) { case *Integer: return NewInteger(int64(*o)) case *Float: return NewInteger(int64(*o)) case *String: if a, err := strconv.ParseFloat(string(*o), 64); err == nil { return NewInteger(int64(a)) } return NewError("%v is not a number", args[0]) default: return NewError("%v is not a number", args[0]) } }, }, { "float", func(args ...Object) Object { if l := len(args); l != 1 { return NewError("float: wrong number of arguments, expected 1, got %d", l) } switch o := args[0].(type) { case *Integer: return NewFloat(float64(*o)) case *Float: return NewFloat(float64(*o)) case *String: if a, err := strconv.ParseFloat(string(*o), 64); err == nil { return NewFloat(a) } return NewError("%v is not a number", args[0]) default: return NewError("%v is not a number", args[0]) } }, }, { "exit", func(args ...Object) Object { var l = len(args) if l == 0 { os.Exit(0) } else if l > 2 { return NewError("exit: wrong number of arguments, max 2, got %d", l) } else if l == 1 { switch o := args[0].(type) { case *Integer: os.Exit(int(*o)) case *String: fmt.Fprintln(Stdout, o) os.Exit(0) default: return NewError("exit: argument must be an integer or string") } } msg, ok := args[0].(*String) if !ok { return NewError("exit: first argument must be a string") } code, ok := args[1].(*Integer) if !ok { return NewError("exit: second argument must be an int") } fmt.Fprintln(Stdout, string(*msg)) os.Exit(int(*code)) return NullObj }, }, { "append", func(args ...Object) Object { if len(args) == 0 { return NewError("append: no argument provided") } lst, ok := args[0].(List) if !ok { return NewError("append: first argument must be a list") } if len(args) > 1 { return append(lst, args[1:]...) } return lst }, }, { "push", func(args ...Object) Object { if len(args) == 0 { return NewError("push: no argument provided") } lst, ok := args[0].(List) if !ok { return NewError("push: first argument must be a list") } if len(args) > 1 { var tmp List for i := len(args) - 1; i > 0; i-- { tmp = append(tmp, args[i]) } return append(tmp, lst...) } return lst }, }, { "range", func(args ...Object) Object { switch len(args) { case 1: if stop, ok := args[0].(*Integer); ok { return listify(0, int(*stop), 1) } return NewError("range: start value must be an int") case 2: start, ok := args[0].(*Integer) if !ok { return NewError("range: start value must be an int") } stop, ok := args[1].(*Integer) if !ok { return NewError("range: stop value must be an int") } return listify(int(*start), int(*stop), 1) case 3: start, ok := args[0].(*Integer) if !ok { return NewError("range: start value must be an int") } stop, ok := args[1].(*Integer) if !ok { return NewError("range: stop value must be an int") } step, ok := args[2].(*Integer) if !ok { return NewError("range: step value must be an int") } if s := int(*step); s != 0 { return listify(int(*start), int(*stop), s) } return NewError("range: step value must not be zero") default: return NewError("range: wrong number of arguments, max 3, got %d", len(args)) } }, }, { "first", func(args ...Object) Object { if l := len(args); l != 1 { return NewError("first: wrong number of arguments, expected 1, got %d", l) } switch o := args[0].(type) { case List: return o[0] case *String: return NewString(string(string(*o)[0])) default: return NewError("first: wrong argument type, expected list, got %s", args[0].Type()) } }, }, { "last", func(args ...Object) Object { if l := len(args); l != 1 { return NewError("last: wrong number of arguments, expected 1, got %d", l) } switch o := args[0].(type) { case List: return o[len(o)-1] case *String: s := string(*o) return NewString(string(s[len(s)-1])) default: return NewError("last: wrong argument type, expected list, got %s", args[0].Type()) } }, }, { "tail", func(args ...Object) Object { if l := len(args); l != 1 { return NewError("tail: wrong number of arguments, expected 1, got %d", l) } switch o := args[0].(type) { case List: return o[1:] case *String: s := string(*o) return NewString(s[1:]) default: return NewError("tail: wrong argument type, expected list, got %s", args[0].Type()) } }, }, { "new", func(args ...Object) Object { if l := len(args); l != 0 { return NewError("new: wrong number of arguments, expected 0, got %d", l) } return NewClass() }, }, }
View Source
var NativeLibs = map[string]map[string]interface{}{ "strings": { "Compare": strings.Compare, "Contains": strings.Contains, "ContainsAny": strings.ContainsAny, "ContainsRune": strings.ContainsRune, "Count": strings.Count, "EqualFold": strings.EqualFold, "Fields": strings.Fields, "FieldsFunc": strings.FieldsFunc, "HasPrefix": strings.HasPrefix, "HasSuffix": strings.HasSuffix, "Index": strings.Index, "IndexAny": strings.IndexAny, "IndexByte": strings.IndexByte, "IndexFunc": strings.IndexFunc, "IndexRune": strings.IndexRune, "Join": strings.Join, "LastIndex": strings.LastIndex, "LastIndexAny": strings.LastIndexAny, "LastIndexByte": strings.LastIndexByte, "LastIndexFunc": strings.LastIndexFunc, "Map": strings.Map, "Repeat": strings.Repeat, "Replace": strings.Replace, "ReplaceAll": strings.ReplaceAll, "Split": strings.Split, "SplitAfter": strings.SplitAfter, "splitAfterN": strings.SplitAfterN, "SplitN": strings.SplitN, "Title": strings.Title, "ToLower": strings.ToLower, "ToLowerSpecial": strings.ToLowerSpecial, "ToTitle": strings.ToTitle, "ToTitleSpecial": strings.ToTitleSpecial, "ToUpper": strings.ToUpper, "ToUpperSpecial": strings.ToUpperSpecial, "ToValidUTF8": strings.ToValidUTF8, "Trim": strings.Trim, "TrimFunc": strings.TrimFunc, "TrimLeft": strings.TrimLeft, "TrimLeftFunc": strings.TrimLeftFunc, "TrimPrefix": strings.TrimPrefix, "TrimRight": strings.TrimRight, "TrimRightFunc": strings.TrimRightFunc, "TrimSpace": strings.TrimSpace, "TrimSuffix": strings.TrimSuffix, }, "regexp": { "MatchString": regexp.MatchString, "QuoteMeta": regexp.QuoteMeta, "Compile": regexp.Compile, "CompilePOSIX": regexp.CompilePOSIX, "MustCompile": regexp.MustCompile, "MustCompilePOSIX": regexp.MustCompilePOSIX, }, }
Functions ¶
This section is empty.
Types ¶
type Builtin ¶
func ResolveBuiltin ¶
type Closure ¶
func NewClosure ¶
type Env ¶
func NewEnvWrap ¶
type Function ¶
type MapGetSetter ¶
type NativeModule ¶
type NativeModule struct {
// contains filtered or unexported fields
}
func (NativeModule) String ¶
func (n NativeModule) String() string
func (NativeModule) Type ¶
func (n NativeModule) Type() Type
type NativeStruct ¶ added in v1.1.0
type NativeStruct struct {
// contains filtered or unexported fields
}
func (NativeStruct) String ¶ added in v1.1.0
func (n NativeStruct) String() string
func (NativeStruct) Type ¶ added in v1.1.0
func (n NativeStruct) Type() Type
type Object ¶
func NewBoolean ¶
func NewContinue ¶
func NewContinue() Object
func NewFunction ¶
func NewFunctionCompiled ¶
func NewFunctionCompiled(i code.Instructions, nLocals, nParams int) Object
func NewGetSetter ¶
func NewGetSetter(s MapGetSetter, n string) Object
func NewInteger ¶
func NewNativeModule ¶
func NewNativeStruct ¶ added in v1.1.0
func NewNativeStruct(s interface{}) Object
Click to show internal directories.
Click to hide internal directories.