package types import "fmt" // ValueType represents the type of a runtime value type ValueType int const ( NIL_TYPE ValueType = iota BOOL_TYPE NUMBER_TYPE STRING_TYPE FUNCTION_TYPE TABLE_TYPE ) // Value interface represents any value in the language at runtime type Value interface { Type() ValueType String() string } // NilValue represents a nil value type NilValue struct{} func (n NilValue) Type() ValueType { return NIL_TYPE } func (n NilValue) String() string { return "nil" } // BoolValue represents a boolean value type BoolValue struct { Value bool } func (b BoolValue) Type() ValueType { return BOOL_TYPE } func (b BoolValue) String() string { if b.Value { return "true" } return "false" } // NumberValue represents a numeric value type NumberValue struct { Value float64 } func (n NumberValue) Type() ValueType { return NUMBER_TYPE } func (n NumberValue) String() string { return fmt.Sprintf("%g", n.Value) } // StringValue represents a string value type StringValue struct { Value string } func (s StringValue) Type() ValueType { return STRING_TYPE } func (s StringValue) String() string { return s.Value } // FunctionValue represents a function value type FunctionValue struct { Name string Arity int // We'll add bytecode and other function data later } func (f FunctionValue) Type() ValueType { return FUNCTION_TYPE } func (f FunctionValue) String() string { if f.Name == "" { return "" } return fmt.Sprintf("", f.Name) } // TableValue represents a table (map/dictionary/array) type TableValue struct { Data map[Value]Value MetaTable *TableValue } func (t TableValue) Type() ValueType { return TABLE_TYPE } func (t TableValue) String() string { return fmt.Sprintf("", &t) }