Documentation ¶
Index ¶
- Variables
- func ImportLookup(taupath string) (string, error)
- type Boolean
- type Break
- type Builtin
- type Class
- type Closure
- type Continue
- type Env
- type Error
- type Float
- type Function
- type GetSetter
- type GetSetterImpl
- type Getter
- type Hashable
- type Integer
- type KeyHash
- type List
- type Map
- type MapGetSetter
- type MapPair
- type Module
- type Moduler
- type NativePlugin
- 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 ...any) Object
- func NewFloat(f float64) Object
- func NewFunction(params []string, env *Env, body any) Object
- func NewFunctionCompiled(i code.Instructions, nLocals, nParams int) Object
- func NewInteger(i int64) Object
- func NewList(elems ...Object) Object
- func NewNativePlugin(path string) Object
- func NewNativeStruct(s any) 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 ( ErrFileNotFound = errors.New("file not found") ErrNoFileProvided = errors.New("no file provided") )
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()) } }, }, { "println", func(args ...Object) Object { fmt.Fprintln(Stdout, toAnySlice(args)...) return NullObj }, }, { "print", func(args ...Object) Object { fmt.Fprint(Stdout, toAnySlice(args)...) 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 { return NewString(fmt.Sprint(toAnySlice(args)...)) }, }, { "error", func(args ...Object) Object { return NewError(fmt.Sprint(toAnySlice(args)...)) }, }, { "type", func(args ...Object) Object { if l := len(args); l != 1 { return NewError("type: wrong number of arguments, expected 1, got %d", l) } return NewString(args[0].Type().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, *Error: fmt.Fprintln(Stdout, o) os.Exit(0) default: return NewError("exit: argument must be an integer, string or error") } } 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() }, }, { "failed", func(args ...Object) Object { if l := len(args); l != 1 { return NewError("failed: wrong number of arguments, expected 1, got %d", l) } _, ok := args[0].(*Error) return ParseBool(ok) }, }, { "plugin", func(args ...Object) Object { if l := len(args); l != 1 { return NewError("plugin: wrong number of arguments, expected 1, got %d", l) } str, ok := args[0].(*String) if !ok { return NewError("plugin: first argument must be a string, got %s instead", args[0].Type()) } return NewNativePlugin(str.String()) }, }, }
Functions ¶
func ImportLookup ¶ added in v1.2.0
Types ¶
type Builtin ¶
func ResolveBuiltin ¶
type Closure ¶
func NewClosure ¶
type Env ¶
func NewEnvWrap ¶
type Function ¶
type GetSetterImpl ¶
func (GetSetterImpl) Object ¶
func (g GetSetterImpl) Object() Object
func (GetSetterImpl) Set ¶
func (g GetSetterImpl) Set(o Object) Object
func (GetSetterImpl) String ¶
func (g GetSetterImpl) String() string
func (GetSetterImpl) Type ¶
func (g GetSetterImpl) Type() Type
type MapGetSetter ¶
type NativePlugin ¶
func (NativePlugin) String ¶
func (n NativePlugin) String() string
func (NativePlugin) Type ¶
func (n NativePlugin) Type() Type
type NativeStruct ¶
type NativeStruct struct {
// contains filtered or unexported fields
}
func (NativeStruct) String ¶
func (n NativeStruct) String() string
func (NativeStruct) Type ¶
func (n NativeStruct) Type() Type
type Object ¶
func NewBoolean ¶
func NewContinue ¶
func NewContinue() Object
func NewFunctionCompiled ¶
func NewFunctionCompiled(i code.Instructions, nLocals, nParams int) Object
func NewInteger ¶
func NewNativePlugin ¶
func NewNativeStruct ¶
type Type ¶
type Type int
const ( NullType Type = iota // null ErrorType // error IntType // int FloatType // float BoolType // bool StringType // string ObjectType // object ReturnType // return FunctionType // function ClosureType // closure BuiltinType // builtin ListType // list MapType // map ContinueType // continue BreakType // break )
Click to show internal directories.
Click to hide internal directories.