134#define TOY_IS_NULL(value) ((value).type == TOY_LITERAL_NULL)
135#define TOY_IS_BOOLEAN(value) ((value).type == TOY_LITERAL_BOOLEAN)
136#define TOY_IS_INTEGER(value) ((value).type == TOY_LITERAL_INTEGER)
137#define TOY_IS_FLOAT(value) ((value).type == TOY_LITERAL_FLOAT)
138#define TOY_IS_STRING(value) ((value).type == TOY_LITERAL_STRING)
139#define TOY_IS_ARRAY(value) ((value).type == TOY_LITERAL_ARRAY)
140#define TOY_IS_DICTIONARY(value) ((value).type == TOY_LITERAL_DICTIONARY)
141#define TOY_IS_FUNCTION(value) ((value).type == TOY_LITERAL_FUNCTION)
142#define TOY_IS_FUNCTION_NATIVE(value) ((value).type == TOY_LITERAL_FUNCTION_NATIVE)
143#define TOY_IS_FUNCTION_HOOK(value) ((value).type == TOY_LITERAL_FUNCTION_HOOK)
144#define TOY_IS_IDENTIFIER(value) ((value).type == TOY_LITERAL_IDENTIFIER)
145#define TOY_IS_TYPE(value) ((value).type == TOY_LITERAL_TYPE)
146#define TOY_IS_OPAQUE(value) ((value).type == TOY_LITERAL_OPAQUE)
148#define TOY_AS_BOOLEAN(value) ((value).as.boolean)
149#define TOY_AS_INTEGER(value) ((value).as.integer)
150#define TOY_AS_FLOAT(value) ((value).as.number)
151#define TOY_AS_STRING(value) ((value).as.string.ptr)
152#define TOY_AS_ARRAY(value) ((Toy_LiteralArray*)((value).as.array))
153#define TOY_AS_DICTIONARY(value) ((Toy_LiteralDictionary*)((value).as.dictionary))
154#define TOY_AS_FUNCTION(value) ((value).as.function)
155#define TOY_AS_FUNCTION_NATIVE(value) ((value).as.function.inner.native)
156#define TOY_AS_FUNCTION_HOOK(value) ((value).as.function.inner.hook)
157#define TOY_AS_IDENTIFIER(value) ((value).as.identifier.ptr)
158#define TOY_AS_TYPE(value) ((value).as.type)
159#define TOY_AS_OPAQUE(value) ((value).as.opaque.ptr)
161#define TOY_TO_NULL_LITERAL ((Toy_Literal){{ .integer = 0 }, TOY_LITERAL_NULL})
162#define TOY_TO_BOOLEAN_LITERAL(value) ((Toy_Literal){{ .boolean = value }, TOY_LITERAL_BOOLEAN})
163#define TOY_TO_INTEGER_LITERAL(value) ((Toy_Literal){{ .integer = value }, TOY_LITERAL_INTEGER})
164#define TOY_TO_FLOAT_LITERAL(value) ((Toy_Literal){{ .number = value }, TOY_LITERAL_FLOAT})
165#define TOY_TO_STRING_LITERAL(value) ((Toy_Literal){{ .string = { .ptr = value }},TOY_LITERAL_STRING})
166#define TOY_TO_ARRAY_LITERAL(value) ((Toy_Literal){{ .array = value }, TOY_LITERAL_ARRAY})
167#define TOY_TO_DICTIONARY_LITERAL(value) ((Toy_Literal){{ .dictionary = value }, TOY_LITERAL_DICTIONARY})
168#define TOY_TO_FUNCTION_LITERAL(value) ((Toy_Literal){{ .function = { .inner = { .ptr = value }, .scope = NULL }}, TOY_LITERAL_FUNCTION})
169#define TOY_TO_FUNCTION_NATIVE_LITERAL(value) ((Toy_Literal){{ .function = { .inner = { .native = value }, .scope = NULL }}, TOY_LITERAL_FUNCTION_NATIVE})
170#define TOY_TO_FUNCTION_HOOK_LITERAL(value) ((Toy_Literal){{ .function = { .inner = { .hook = value }, .scope = NULL }}, TOY_LITERAL_FUNCTION_HOOK})
171#define TOY_TO_IDENTIFIER_LITERAL(value) Toy_private_toIdentifierLiteral(value)
172#define TOY_TO_TYPE_LITERAL(value, c) ((Toy_Literal){{ .type = { .typeOf = value, .constant = c, .subtypes = NULL, .capacity = 0, .count = 0 }}, TOY_LITERAL_TYPE})
173#define TOY_TO_OPAQUE_LITERAL(value, t) ((Toy_Literal){{ .opaque = { .ptr = value, .tag = t }}, TOY_LITERAL_OPAQUE})
176#define TOY_IS_INDEX_BLANK(value) ((value).type == TOY_LITERAL_INDEX_BLANK)
177#define TOY_TO_INDEX_BLANK_LITERAL ((Toy_Literal){{ .integer = 0 }, TOY_LITERAL_INDEX_BLANK})
187#define TOY_IS_TRUTHY(x) Toy_private_isTruthy(x)
189#define TOY_AS_FUNCTION_BYTECODE_LENGTH(lit) (Toy_lengthRefFunction((lit).inner.ptr))
191#define TOY_MAX_STRING_LENGTH 4096
192#define TOY_HASH_I(lit) ((lit).as.identifier.hash)
193#define TOY_TYPE_PUSH_SUBTYPE(lit, subtype) Toy_private_typePushSubtype(lit, subtype)
194#define TOY_GET_OPAQUE_TAG(o) o.as.opaque.tag
Definition: toy_interpreter.h:25
@????@
Definition: toy_literal_array.h:20
Definition: toy_literal_dictionary.h:31
Definition: toy_literal.h:85
bool boolean
Definition: toy_literal.h:87
struct Toy_LiteralArray * array
Definition: toy_literal.h:96
Toy_RefString * ptr
Definition: toy_literal.h:92
int integer
Definition: toy_literal.h:88
struct Toy_Literal::@0::@1 string
struct Toy_Literal::@0::@2 function
void * ptr
Definition: toy_literal.h:122
struct Toy_Literal::@0::@4 type
bool constant
Definition: toy_literal.h:118
int tag
Definition: toy_literal.h:123
Toy_RefFunction * ptr
Definition: toy_literal.h:101
struct Toy_Scope * scope
Definition: toy_literal.h:105
struct Toy_Literal::@0::@5 opaque
unsigned char capacity
Definition: toy_literal.h:116
struct Toy_LiteralDictionary * dictionary
Definition: toy_literal.h:97
struct Toy_Literal * subtypes
Definition: toy_literal.h:114
unsigned char count
Definition: toy_literal.h:117
Toy_LiteralType typeOf
Definition: toy_literal.h:115
float number
Definition: toy_literal.h:89
Toy_NativeFn native
Definition: toy_literal.h:102
struct Toy_Literal::@0::@3 identifier
Toy_LiteralType type
Definition: toy_literal.h:129
Toy_HookFn hook
Definition: toy_literal.h:103
int hash
Definition: toy_literal.h:110
Definition: toy_reffunction.h:39
Definition: toy_refstring.h:41
Definition: toy_scope.h:21
void(* Toy_PrintFn)(const char *)
@???@
Definition: toy_literal.h:48
TOY_API void Toy_printLiteral(Toy_Literal literal)
Wraps a call to Toy_printLiteralCustom, with a printf-stdout wrapper as printFn.
TOY_API Toy_Literal Toy_copyLiteral(Toy_Literal original)
Returns a copy of the given literal. Literals should never be copied without this function,...
int(* Toy_HookFn)(struct Toy_Interpreter *interpreter, struct Toy_Literal identifier, struct Toy_Literal alias)
@???@
Definition: toy_literal.h:41
int(* Toy_NativeFn)(struct Toy_Interpreter *interpreter, struct Toy_LiteralArray *arguments)
@???@
Definition: toy_literal.h:30
TOY_API Toy_Literal * Toy_private_typePushSubtype(Toy_Literal *lit, Toy_Literal subtype)
@???@
TOY_API bool Toy_private_isTruthy(Toy_Literal x)
@???@
TOY_API void Toy_freeLiteral(Toy_Literal literal)
@???@
TOY_API void Toy_printLiteralCustom(Toy_Literal literal, Toy_PrintFn)
Passes the string representation of literal to printFn. This function is not thread safe - due to the...
TOY_API Toy_Literal Toy_private_toIdentifierLiteral(Toy_RefString *ptr)
@???@
TOY_API bool Toy_literalsAreEqual(Toy_Literal lhs, Toy_Literal rhs)
Checks to see if two given literals are equal. When an integer and a float are compared,...
Toy_LiteralType
@???@
Definition: toy_literal.h:55
@ TOY_LITERAL_TYPE
Definition: toy_literal.h:65
@ TOY_LITERAL_ARRAY_INTERMEDIATE
Definition: toy_literal.h:71
@ TOY_LITERAL_TYPE_INTERMEDIATE
Definition: toy_literal.h:70
@ TOY_LITERAL_ANY
Definition: toy_literal.h:67
@ TOY_LITERAL_INDEX_BLANK
Definition: toy_literal.h:77
@ TOY_LITERAL_FUNCTION
Definition: toy_literal.h:63
@ TOY_LITERAL_INTEGER
Definition: toy_literal.h:58
@ TOY_LITERAL_FUNCTION_ARG_REST
Definition: toy_literal.h:74
@ TOY_LITERAL_NULL
Definition: toy_literal.h:56
@ TOY_LITERAL_DICTIONARY
Definition: toy_literal.h:62
@ TOY_LITERAL_FLOAT
Definition: toy_literal.h:59
@ TOY_LITERAL_DICTIONARY_INTERMEDIATE
Definition: toy_literal.h:72
@ TOY_LITERAL_STRING
Definition: toy_literal.h:60
@ TOY_LITERAL_BOOLEAN
Definition: toy_literal.h:57
@ TOY_LITERAL_FUNCTION_INTERMEDIATE
Definition: toy_literal.h:73
@ TOY_LITERAL_OPAQUE
Definition: toy_literal.h:66
@ TOY_LITERAL_IDENTIFIER
Definition: toy_literal.h:64
@ TOY_LITERAL_FUNCTION_HOOK
Definition: toy_literal.h:76
@ TOY_LITERAL_ARRAY
Definition: toy_literal.h:61
@ TOY_LITERAL_FUNCTION_NATIVE
Definition: toy_literal.h:75
TOY_API int Toy_hashLiteral(Toy_Literal lit)
Finds the hash of a literal, for various purposes. Different hashing algorithms are used for differen...