Toy 1.1.6
The Toy programming language is an imperative bytecode-intermediate embedded scripting language
Loading...
Searching...
No Matches
Data Structures | Macros | Typedefs | Enumerations | Functions
toy_literal.h File Reference

@???@ More...

#include <stdbool.h>
#include "toy_common.h"
#include "toy_refstring.h"
#include "toy_reffunction.h"

Go to the source code of this file.

Data Structures

struct  Toy_Literal
 

Macros

#define TOY_IS_NULL(value)   ((value).type == TOY_LITERAL_NULL)
 
#define TOY_IS_BOOLEAN(value)   ((value).type == TOY_LITERAL_BOOLEAN)
 
#define TOY_IS_INTEGER(value)   ((value).type == TOY_LITERAL_INTEGER)
 
#define TOY_IS_FLOAT(value)   ((value).type == TOY_LITERAL_FLOAT)
 
#define TOY_IS_STRING(value)   ((value).type == TOY_LITERAL_STRING)
 
#define TOY_IS_ARRAY(value)   ((value).type == TOY_LITERAL_ARRAY)
 
#define TOY_IS_DICTIONARY(value)   ((value).type == TOY_LITERAL_DICTIONARY)
 
#define TOY_IS_FUNCTION(value)   ((value).type == TOY_LITERAL_FUNCTION)
 
#define TOY_IS_FUNCTION_NATIVE(value)   ((value).type == TOY_LITERAL_FUNCTION_NATIVE)
 
#define TOY_IS_FUNCTION_HOOK(value)   ((value).type == TOY_LITERAL_FUNCTION_HOOK)
 
#define TOY_IS_IDENTIFIER(value)   ((value).type == TOY_LITERAL_IDENTIFIER)
 
#define TOY_IS_TYPE(value)   ((value).type == TOY_LITERAL_TYPE)
 
#define TOY_IS_OPAQUE(value)   ((value).type == TOY_LITERAL_OPAQUE)
 
#define TOY_AS_BOOLEAN(value)   ((value).as.boolean)
 
#define TOY_AS_INTEGER(value)   ((value).as.integer)
 
#define TOY_AS_FLOAT(value)   ((value).as.number)
 
#define TOY_AS_STRING(value)   ((value).as.string.ptr)
 
#define TOY_AS_ARRAY(value)   ((Toy_LiteralArray*)((value).as.array))
 
#define TOY_AS_DICTIONARY(value)   ((Toy_LiteralDictionary*)((value).as.dictionary))
 
#define TOY_AS_FUNCTION(value)   ((value).as.function)
 
#define TOY_AS_FUNCTION_NATIVE(value)   ((value).as.function.inner.native)
 
#define TOY_AS_FUNCTION_HOOK(value)   ((value).as.function.inner.hook)
 
#define TOY_AS_IDENTIFIER(value)   ((value).as.identifier.ptr)
 
#define TOY_AS_TYPE(value)   ((value).as.type)
 
#define TOY_AS_OPAQUE(value)   ((value).as.opaque.ptr)
 
#define TOY_TO_NULL_LITERAL   ((Toy_Literal){{ .integer = 0 }, TOY_LITERAL_NULL})
 
#define TOY_TO_BOOLEAN_LITERAL(value)   ((Toy_Literal){{ .boolean = value }, TOY_LITERAL_BOOLEAN})
 
#define TOY_TO_INTEGER_LITERAL(value)   ((Toy_Literal){{ .integer = value }, TOY_LITERAL_INTEGER})
 
#define TOY_TO_FLOAT_LITERAL(value)   ((Toy_Literal){{ .number = value }, TOY_LITERAL_FLOAT})
 
#define TOY_TO_STRING_LITERAL(value)   ((Toy_Literal){{ .string = { .ptr = value }},TOY_LITERAL_STRING})
 
#define TOY_TO_ARRAY_LITERAL(value)   ((Toy_Literal){{ .array = value }, TOY_LITERAL_ARRAY})
 
#define TOY_TO_DICTIONARY_LITERAL(value)   ((Toy_Literal){{ .dictionary = value }, TOY_LITERAL_DICTIONARY})
 
#define TOY_TO_FUNCTION_LITERAL(value)   ((Toy_Literal){{ .function = { .inner = { .ptr = value }, .scope = NULL }}, TOY_LITERAL_FUNCTION})
 
#define TOY_TO_FUNCTION_NATIVE_LITERAL(value)   ((Toy_Literal){{ .function = { .inner = { .native = value }, .scope = NULL }}, TOY_LITERAL_FUNCTION_NATIVE})
 
#define TOY_TO_FUNCTION_HOOK_LITERAL(value)   ((Toy_Literal){{ .function = { .inner = { .hook = value }, .scope = NULL }}, TOY_LITERAL_FUNCTION_HOOK})
 
#define TOY_TO_IDENTIFIER_LITERAL(value)   Toy_private_toIdentifierLiteral(value)
 
#define TOY_TO_TYPE_LITERAL(value, c)   ((Toy_Literal){{ .type = { .typeOf = value, .constant = c, .subtypes = NULL, .capacity = 0, .count = 0 }}, TOY_LITERAL_TYPE})
 
#define TOY_TO_OPAQUE_LITERAL(value, t)   ((Toy_Literal){{ .opaque = { .ptr = value, .tag = t }}, TOY_LITERAL_OPAQUE})
 
#define TOY_IS_INDEX_BLANK(value)   ((value).type == TOY_LITERAL_INDEX_BLANK)
 
#define TOY_TO_INDEX_BLANK_LITERAL   ((Toy_Literal){{ .integer = 0 }, TOY_LITERAL_INDEX_BLANK})
 
#define TOY_IS_TRUTHY(x)   Toy_private_isTruthy(x)
 
#define TOY_AS_FUNCTION_BYTECODE_LENGTH(lit)   (Toy_lengthRefFunction((lit).inner.ptr))
 
#define TOY_MAX_STRING_LENGTH   4096
 
#define TOY_HASH_I(lit)   ((lit).as.identifier.hash)
 
#define TOY_TYPE_PUSH_SUBTYPE(lit, subtype)   Toy_private_typePushSubtype(lit, subtype)
 
#define TOY_GET_OPAQUE_TAG(o)   o.as.opaque.tag
 

Typedefs

typedef int(* Toy_NativeFn) (struct Toy_Interpreter *interpreter, struct Toy_LiteralArray *arguments)
 @???@
 
typedef int(* Toy_HookFn) (struct Toy_Interpreter *interpreter, struct Toy_Literal identifier, struct Toy_Literal alias)
 @???@
 
typedef void(* Toy_PrintFn) (const char *)
 @???@
 
typedef struct Toy_Literal Toy_Literal
 @???@
 

Enumerations

enum  Toy_LiteralType {
  TOY_LITERAL_NULL , TOY_LITERAL_BOOLEAN , TOY_LITERAL_INTEGER , TOY_LITERAL_FLOAT ,
  TOY_LITERAL_STRING , TOY_LITERAL_ARRAY , TOY_LITERAL_DICTIONARY , TOY_LITERAL_FUNCTION ,
  TOY_LITERAL_IDENTIFIER , TOY_LITERAL_TYPE , TOY_LITERAL_OPAQUE , TOY_LITERAL_ANY ,
  TOY_LITERAL_TYPE_INTERMEDIATE , TOY_LITERAL_ARRAY_INTERMEDIATE , TOY_LITERAL_DICTIONARY_INTERMEDIATE , TOY_LITERAL_FUNCTION_INTERMEDIATE ,
  TOY_LITERAL_FUNCTION_ARG_REST , TOY_LITERAL_FUNCTION_NATIVE , TOY_LITERAL_FUNCTION_HOOK , TOY_LITERAL_INDEX_BLANK
}
 @???@ More...
 

Functions

TOY_API void Toy_freeLiteral (Toy_Literal literal)
 @???@
 
TOY_API bool Toy_private_isTruthy (Toy_Literal x)
 @???@
 
TOY_API Toy_Literal Toy_private_toIdentifierLiteral (Toy_RefString *ptr)
 @???@
 
TOY_API Toy_Literal * Toy_private_typePushSubtype (Toy_Literal *lit, Toy_Literal subtype)
 @???@
 
TOY_API Toy_Literal Toy_copyLiteral (Toy_Literal original)
 Returns a copy of the given literal. Literals should never be copied without this function, as it handles a lot of internal memory allocations.
 
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, the integer is cooerced into a float for the duration of the call. Arrays and dictionaries are equal only if their keys and values all equal. Likewise, types only equal if all subtypes are equal, in order. Functions and opaques are never equal to anything, while values with the type TOY_LITERAL_ANY are always equal.
 
TOY_API int Toy_hashLiteral (Toy_Literal lit)
 Finds the hash of a literal, for various purposes. Different hashing algorithms are used for different types, and some types can't be hashed at all. Types that can't be hashed:
 
TOY_API void Toy_printLiteral (Toy_Literal literal)
 Wraps a call to Toy_printLiteralCustom, with a printf-stdout wrapper as printFn.
 
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 loopy and recursive nature of printing compound values, this function uses some globally persistent variables.
 

Detailed Description

@???@

Macro Definition Documentation

◆ TOY_AS_ARRAY

#define TOY_AS_ARRAY (   value)    ((Toy_LiteralArray*)((value).as.array))

@???@

◆ TOY_AS_BOOLEAN

#define TOY_AS_BOOLEAN (   value)    ((value).as.boolean)

@???@

◆ TOY_AS_DICTIONARY

#define TOY_AS_DICTIONARY (   value)    ((Toy_LiteralDictionary*)((value).as.dictionary))

@???@

◆ TOY_AS_FLOAT

#define TOY_AS_FLOAT (   value)    ((value).as.number)

@???@

◆ TOY_AS_FUNCTION

#define TOY_AS_FUNCTION (   value)    ((value).as.function)

@???@

◆ TOY_AS_FUNCTION_BYTECODE_LENGTH

#define TOY_AS_FUNCTION_BYTECODE_LENGTH (   lit)    (Toy_lengthRefFunction((lit).inner.ptr))

@???@

◆ TOY_AS_FUNCTION_HOOK

#define TOY_AS_FUNCTION_HOOK (   value)    ((value).as.function.inner.hook)

@???@

◆ TOY_AS_FUNCTION_NATIVE

#define TOY_AS_FUNCTION_NATIVE (   value)    ((value).as.function.inner.native)

@???@

◆ TOY_AS_IDENTIFIER

#define TOY_AS_IDENTIFIER (   value)    ((value).as.identifier.ptr)

@???@

◆ TOY_AS_INTEGER

#define TOY_AS_INTEGER (   value)    ((value).as.integer)

@???@

◆ TOY_AS_OPAQUE

#define TOY_AS_OPAQUE (   value)    ((value).as.opaque.ptr)

@???@

◆ TOY_AS_STRING

#define TOY_AS_STRING (   value)    ((value).as.string.ptr)

@???@

◆ TOY_AS_TYPE

#define TOY_AS_TYPE (   value)    ((value).as.type)

@???@

◆ TOY_GET_OPAQUE_TAG

#define TOY_GET_OPAQUE_TAG (   o)    o.as.opaque.tag

@???@

◆ TOY_HASH_I

#define TOY_HASH_I (   lit)    ((lit).as.identifier.hash)

@???@

◆ TOY_IS_ARRAY

#define TOY_IS_ARRAY (   value)    ((value).type == TOY_LITERAL_ARRAY)

@???@

◆ TOY_IS_BOOLEAN

#define TOY_IS_BOOLEAN (   value)    ((value).type == TOY_LITERAL_BOOLEAN)

@???@

◆ TOY_IS_DICTIONARY

#define TOY_IS_DICTIONARY (   value)    ((value).type == TOY_LITERAL_DICTIONARY)

@???@

◆ TOY_IS_FLOAT

#define TOY_IS_FLOAT (   value)    ((value).type == TOY_LITERAL_FLOAT)

@???@

◆ TOY_IS_FUNCTION

#define TOY_IS_FUNCTION (   value)    ((value).type == TOY_LITERAL_FUNCTION)

@???@

◆ TOY_IS_FUNCTION_HOOK

#define TOY_IS_FUNCTION_HOOK (   value)    ((value).type == TOY_LITERAL_FUNCTION_HOOK)

@???@

◆ TOY_IS_FUNCTION_NATIVE

#define TOY_IS_FUNCTION_NATIVE (   value)    ((value).type == TOY_LITERAL_FUNCTION_NATIVE)

@???@

◆ TOY_IS_IDENTIFIER

#define TOY_IS_IDENTIFIER (   value)    ((value).type == TOY_LITERAL_IDENTIFIER)

@???@

◆ TOY_IS_INDEX_BLANK

#define TOY_IS_INDEX_BLANK (   value)    ((value).type == TOY_LITERAL_INDEX_BLANK)

@???@

◆ TOY_IS_INTEGER

#define TOY_IS_INTEGER (   value)    ((value).type == TOY_LITERAL_INTEGER)

@???@

◆ TOY_IS_NULL

#define TOY_IS_NULL (   value)    ((value).type == TOY_LITERAL_NULL)

@???@

◆ TOY_IS_OPAQUE

#define TOY_IS_OPAQUE (   value)    ((value).type == TOY_LITERAL_OPAQUE)

@???@

◆ TOY_IS_STRING

#define TOY_IS_STRING (   value)    ((value).type == TOY_LITERAL_STRING)

@???@

◆ TOY_IS_TRUTHY

#define TOY_IS_TRUTHY (   x)    Toy_private_isTruthy(x)

@???@

◆ TOY_IS_TYPE

#define TOY_IS_TYPE (   value)    ((value).type == TOY_LITERAL_TYPE)

@???@

◆ TOY_MAX_STRING_LENGTH

#define TOY_MAX_STRING_LENGTH   4096

@???@

◆ TOY_TO_ARRAY_LITERAL

#define TOY_TO_ARRAY_LITERAL (   value)    ((Toy_Literal){{ .array = value }, TOY_LITERAL_ARRAY})

@???@

◆ TOY_TO_BOOLEAN_LITERAL

#define TOY_TO_BOOLEAN_LITERAL (   value)    ((Toy_Literal){{ .boolean = value }, TOY_LITERAL_BOOLEAN})

@???@

◆ TOY_TO_DICTIONARY_LITERAL

#define TOY_TO_DICTIONARY_LITERAL (   value)    ((Toy_Literal){{ .dictionary = value }, TOY_LITERAL_DICTIONARY})

@???@

◆ TOY_TO_FLOAT_LITERAL

#define TOY_TO_FLOAT_LITERAL (   value)    ((Toy_Literal){{ .number = value }, TOY_LITERAL_FLOAT})

@???@

◆ TOY_TO_FUNCTION_HOOK_LITERAL

#define TOY_TO_FUNCTION_HOOK_LITERAL (   value)    ((Toy_Literal){{ .function = { .inner = { .hook = value }, .scope = NULL }}, TOY_LITERAL_FUNCTION_HOOK})

@???@

◆ TOY_TO_FUNCTION_LITERAL

#define TOY_TO_FUNCTION_LITERAL (   value)    ((Toy_Literal){{ .function = { .inner = { .ptr = value }, .scope = NULL }}, TOY_LITERAL_FUNCTION})

@???@

◆ TOY_TO_FUNCTION_NATIVE_LITERAL

#define TOY_TO_FUNCTION_NATIVE_LITERAL (   value)    ((Toy_Literal){{ .function = { .inner = { .native = value }, .scope = NULL }}, TOY_LITERAL_FUNCTION_NATIVE})

@???@

◆ TOY_TO_IDENTIFIER_LITERAL

#define TOY_TO_IDENTIFIER_LITERAL (   value)    Toy_private_toIdentifierLiteral(value)

@???@

◆ TOY_TO_INDEX_BLANK_LITERAL

#define TOY_TO_INDEX_BLANK_LITERAL   ((Toy_Literal){{ .integer = 0 }, TOY_LITERAL_INDEX_BLANK})

@???@

◆ TOY_TO_INTEGER_LITERAL

#define TOY_TO_INTEGER_LITERAL (   value)    ((Toy_Literal){{ .integer = value }, TOY_LITERAL_INTEGER})

@???@

◆ TOY_TO_NULL_LITERAL

#define TOY_TO_NULL_LITERAL   ((Toy_Literal){{ .integer = 0 }, TOY_LITERAL_NULL})

@???@

◆ TOY_TO_OPAQUE_LITERAL

#define TOY_TO_OPAQUE_LITERAL (   value,
  t 
)    ((Toy_Literal){{ .opaque = { .ptr = value, .tag = t }}, TOY_LITERAL_OPAQUE})

@???@

◆ TOY_TO_STRING_LITERAL

#define TOY_TO_STRING_LITERAL (   value)    ((Toy_Literal){{ .string = { .ptr = value }},TOY_LITERAL_STRING})

@???@

◆ TOY_TO_TYPE_LITERAL

#define TOY_TO_TYPE_LITERAL (   value,
  c 
)    ((Toy_Literal){{ .type = { .typeOf = value, .constant = c, .subtypes = NULL, .capacity = 0, .count = 0 }}, TOY_LITERAL_TYPE})

@???@

◆ TOY_TYPE_PUSH_SUBTYPE

#define TOY_TYPE_PUSH_SUBTYPE (   lit,
  subtype 
)    Toy_private_typePushSubtype(lit, subtype)

@???@

Typedef Documentation

◆ Toy_HookFn

int(* Toy_HookFn)(struct Toy_Interpreter *interpreter, struct Toy_Literal identifier, struct Toy_Literal alias)

@???@

Parameters
interpreter
identifier
alias
Returns

◆ Toy_Literal

@???@

◆ Toy_NativeFn

int(* Toy_NativeFn)(struct Toy_Interpreter *interpreter, struct Toy_LiteralArray *arguments)

@???@

Parameters
interpreter
arguments
Returns

◆ Toy_PrintFn

void(* Toy_PrintFn)(const char *)

@???@

Enumeration Type Documentation

◆ Toy_LiteralType

@???@

Enumerator
TOY_LITERAL_NULL 

TOY_LITERAL_NULL

TOY_LITERAL_BOOLEAN 

TOY_LITERAL_BOOLEAN

TOY_LITERAL_INTEGER 

TOY_LITERAL_INTEGER

TOY_LITERAL_FLOAT 

TOY_LITERAL_FLOAT

TOY_LITERAL_STRING 

TOY_LITERAL_STRING

TOY_LITERAL_ARRAY 

TOY_LITERAL_ARRAY

TOY_LITERAL_DICTIONARY 

TOY_LITERAL_DICTIONARY

TOY_LITERAL_FUNCTION 

TOY_LITERAL_FUNCTION

TOY_LITERAL_IDENTIFIER 

TOY_LITERAL_IDENTIFIER

TOY_LITERAL_TYPE 

TOY_LITERAL_TYPE

TOY_LITERAL_OPAQUE 

TOY_LITERAL_OPAQUE

TOY_LITERAL_ANY 

TOY_LITERAL_ANY

TOY_LITERAL_TYPE_INTERMEDIATE 

used to process types in the compiler only

TOY_LITERAL_ARRAY_INTERMEDIATE 

used to process arrays in the compiler only

TOY_LITERAL_DICTIONARY_INTERMEDIATE 

used to process dictionaries in the compiler only

TOY_LITERAL_FUNCTION_INTERMEDIATE 

used to process functions in the compiler only

TOY_LITERAL_FUNCTION_ARG_REST 

used to process function rest parameters only

TOY_LITERAL_FUNCTION_NATIVE 

for handling native functions only

TOY_LITERAL_FUNCTION_HOOK 

for handling hook functions within literals only

TOY_LITERAL_INDEX_BLANK 

for blank indexing i.e. arr[:]

Function Documentation

◆ Toy_copyLiteral()

Toy_Literal Toy_copyLiteral ( Toy_Literal  original)

Returns a copy of the given literal. Literals should never be copied without this function, as it handles a lot of internal memory allocations.

Parameters
original
Returns

◆ Toy_freeLiteral()

void Toy_freeLiteral ( Toy_Literal  literal)

@???@

Parameters
literal

◆ Toy_hashLiteral()

int Toy_hashLiteral ( Toy_Literal  lit)

Finds the hash of a literal, for various purposes. Different hashing algorithms are used for different types, and some types can't be hashed at all. Types that can't be hashed:

  • all kinds of functions
  • type
  • opaque
  • any In the case of identifiers, their hashes are precomputed on creation and are stored within the literal.
Parameters
lit
Returns

◆ Toy_literalsAreEqual()

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, the integer is cooerced into a float for the duration of the call. Arrays and dictionaries are equal only if their keys and values all equal. Likewise, types only equal if all subtypes are equal, in order. Functions and opaques are never equal to anything, while values with the type TOY_LITERAL_ANY are always equal.

Parameters
lhs
rhs
Returns

◆ Toy_printLiteral()

void Toy_printLiteral ( Toy_Literal  literal)

Wraps a call to Toy_printLiteralCustom, with a printf-stdout wrapper as printFn.

Parameters
literal

◆ Toy_printLiteralCustom()

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 loopy and recursive nature of printing compound values, this function uses some globally persistent variables.

Parameters
literal
Toy_PrintFn

◆ Toy_private_isTruthy()

bool Toy_private_isTruthy ( Toy_Literal  x)

@???@

Parameters
x
Returns

◆ Toy_private_toIdentifierLiteral()

Toy_Literal Toy_private_toIdentifierLiteral ( Toy_RefString *  ptr)

@???@

Parameters
ptr
Returns

◆ Toy_private_typePushSubtype()

Toy_Literal * Toy_private_typePushSubtype ( Toy_Literal *  lit,
Toy_Literal  subtype 
)

@???@

Parameters
lit
subtype
Returns