Documentation
¶
Index ¶
Constants ¶
View Source
const ( INTEGER_OBJ = "INTEGER" BOOLEAN_OBJ = "BOOLEAN" STRING_OBJ = "STRING" NULL_OBJ = "NULL" RETURN_VALUE_OBJ = "RETURN_VALUE" ERROR_VALUE_OBJ = "ERROR_VALUE" FUNCTION_OBJ = "FUNCTION" COMPILED_FUNCTION_OBJ = "COMPILED_FUNCTION" CLOSURE_OBJ = "CLOSURE" BUILTIN_OBJ = "BUILTIN" ARRAY_OBJ = "ARRAY" VAR_ARGS_OBJ = "VAR_ARGS" MAP_OBJ = "MAP" )
View Source
const RED = "\x1b[31m"
View Source
const RESET_COLOR = "\x1b[0m"
View Source
const UNDERLINE = "\x1b[4m"
View Source
const UNDERLINE_RESET = "\x1b[24m"
Variables ¶
View Source
var Builtins = []struct { Name string Builtin *Builtin }{ { Name: "len", Builtin: &Builtin{ Function: func(span token.Span, objects ...Object) Object { if len(objects) != 1 { return mkError(span, "\"len\" builtin takes a single string or array argument") } strObj, ok := objects[0].(*String) if ok { return &Integer{Value: int64(len(strObj.Value))} } arrObj, ok := objects[0].(*Array) if ok { return &Integer{Value: int64(len(arrObj.Elems))} } return mkError(span, "\"len\" builtin takes a single string or array argument") }, }, }, { Name: "first", Builtin: &Builtin{ Function: func(span token.Span, objects ...Object) Object { if len(objects) != 1 { return mkError(span, "\"first\" builtin takes a single array argument") } arrObj, ok := objects[0].(*Array) if ok { if len(arrObj.Elems) == 0 { return mkError(span, "Array is empty") } return arrObj.Elems[0] } return mkError(span, "\"first\" builtin takes a single array argument") }, }, }, { Name: "last", Builtin: &Builtin{ Function: func(span token.Span, objects ...Object) Object { if len(objects) != 1 { return mkError(span, "\"last\" builtin takes a single array argument") } arrObj, ok := objects[0].(*Array) if ok { if len(arrObj.Elems) == 0 { return mkError(span, "Array is empty") } return arrObj.Elems[len(arrObj.Elems)-1] } return mkError(span, "\"last\" builtin takes a single array argument") }, }, }, { Name: "rest", Builtin: &Builtin{ Function: func(span token.Span, objects ...Object) Object { if len(objects) != 1 { return mkError(span, "\"rest\" builtin takes a single array argument") } arrObj, ok := objects[0].(*Array) if ok { if len(arrObj.Elems) == 0 { return mkError(span, "Array is empty") } newArr := &Array{Elems: make([]Object, len(arrObj.Elems)-1)} copy(newArr.Elems[:], arrObj.Elems[1:]) return newArr } return mkError(span, "\"rest\" builtin takes a single array argument") }, }, }, { Name: "push", Builtin: &Builtin{ Function: func(span token.Span, objects ...Object) Object { if len(objects) != 2 { return mkError(span, "\"push\" builtin takes an array argument and a new object to push") } arrObj, ok := objects[0].(*Array) if !ok { return mkError(span, "\"push\" builtin takes an array argument and a new object to push") } oldLen := len(arrObj.Elems) newArr := &Array{Elems: make([]Object, oldLen+1)} copy(newArr.Elems[:oldLen], arrObj.Elems[:]) newArr.Elems[oldLen] = objects[1] return newArr }, }, }, { Name: "puts", Builtin: &Builtin{ Function: func(span token.Span, objects ...Object) Object { for _, object := range objects { fmt.Print(object.Inspect()) } fmt.Println() return nil }, }, }, { Name: "toArray", Builtin: &Builtin{ Function: func(span token.Span, objects ...Object) Object { if len(objects) != 1 { return mkError(span, "\"toArray\" builtin takes a VarArg argument") } varArgObj, ok := objects[0].(*VarArgs) if !ok { return mkError(span, "\"toArray\" builtin takes a VarArg argument") } return &Array{Elems: varArgObj.Elems} }, }, }, { Name: "contains", Builtin: &Builtin{ Function: func(span token.Span, objects ...Object) Object { if len(objects) != 2 { return mkError(span, "\"contains\" builtin takes a HashMap argument and a key") } hashMapObj, ok := objects[0].(*HashMap) if !ok { return mkError(span, "First argument is not a hash map") } keyObj, ok := objects[1].(Hashable) if !ok { return mkError(span, "Second argument is not a hashable object") } elem, ok := hashMapObj.Elems[keyObj.HashKey()] if ok { if elem.Key.Inspect() == keyObj.Inspect() { return &Boolean{Value: true} } } return &Boolean{Value: false} }, }, }, }
Functions ¶
This section is empty.
Types ¶
type Array ¶
type Array struct {
Elems []Object
}
func (*Array) Type ¶
func (a *Array) Type() ObjectType
type Boolean ¶
type Boolean struct {
Value bool
}
func (*Boolean) Type ¶
func (i *Boolean) Type() ObjectType
type Builtin ¶
type Builtin struct {
Function BuiltinFunction
}
func GetBuiltinByName ¶
func (*Builtin) Type ¶
func (f *Builtin) Type() ObjectType
type Closure ¶
type Closure struct { Fn *CompiledFunction FreeObjects []Object }
func (*Closure) Type ¶
func (f *Closure) Type() ObjectType
type CompiledFunction ¶
type CompiledFunction struct { Instructions code.Instructions NumLocals int NumArgs int VarArgs bool }
func (*CompiledFunction) Inspect ¶
func (f *CompiledFunction) Inspect() string
func (*CompiledFunction) Type ¶
func (f *CompiledFunction) Type() ObjectType
type Environment ¶
type Environment struct {
// contains filtered or unexported fields
}
func NewEnclosedEnvironment ¶
func NewEnclosedEnvironment(outer *Environment) *Environment
func NewEnvironment ¶
func NewEnvironment() *Environment
func (*Environment) Copy ¶
func (e *Environment) Copy() *Environment
func (*Environment) GetVarArgs ¶
func (e *Environment) GetVarArgs() ([]Object, bool)
func (*Environment) SetVarArgs ¶
func (e *Environment) SetVarArgs(varArgs []Object)
type Function ¶
type Function struct { Args []*ast.IdentifierExpr VarArgs bool Body *ast.BlockStatement Env *Environment }
func (*Function) Type ¶
func (f *Function) Type() ObjectType
type Integer ¶
type Integer struct {
Value int64
}
func (*Integer) Type ¶
func (i *Integer) Type() ObjectType
type Object ¶
type Object interface { Type() ObjectType Inspect() string }
type ObjectType ¶
type ObjectType string
type Return ¶
type Return struct {
Value Object
}
func (*Return) Type ¶
func (r *Return) Type() ObjectType
Click to show internal directories.
Click to hide internal directories.