diff --git a/src/interface.c b/src/interface.c index 280c885..e97e9b9 100644 --- a/src/interface.c +++ b/src/interface.c @@ -1,4 +1,3 @@ -#include "lexer.h" #include "parser.h" #include "interpreter.h" #include "types.h" @@ -68,11 +67,34 @@ GroundValue groundCreateValue(GroundValueType type, ...) { return createListGroundValue(va_arg(args, List)); break; } - default: { + case FUNCTION: { + return createFunctionGroundValue(va_arg(args, GroundFunction*)); + break; + } + case STRUCTVAL: { + GroundValue gv; + gv.type = STRUCTVAL; + gv.data.structVal = malloc(sizeof(GroundStruct)); + *gv.data.structVal = va_arg(args, GroundStruct); + return gv; + } + case CUSTOM: { + // FIXME do this later lmao return createNoneGroundValue(); + break; + } + case ERROR: { + return createErrorGroundValue(va_arg(args, GroundError)); + break; + } + case NONE: { + return createNoneGroundValue(); + break; } } + return createNoneGroundValue(); + va_end(args); } @@ -90,3 +112,18 @@ void groundPrintProgram(GroundProgram* program) { GroundProgram groundParseFile(const char* code) { return parseFile(code); } + +GroundStruct groundCreateStruct() { + GroundStruct gs; + gs.size = 0; + gs.fields = malloc(sizeof(GroundStructField)); + return gs; +} + +void groundAddValueToScope(GroundScope* gs, const char* name, GroundValue value) { + addVariable(gs->variables, name, value); +} + +void groundAddFieldToStruct(GroundStruct* gstruct, char* name, GroundValue field) { + addFieldToStruct(gstruct, name, field); +} diff --git a/src/interpreter.h b/src/interpreter.h index cde1fff..ae78460 100644 --- a/src/interpreter.h +++ b/src/interpreter.h @@ -42,6 +42,7 @@ GroundFunction* parseFunction(GroundProgram* in, size_t errorOffset); GroundValue interpretGroundProgram(GroundProgram* in, GroundScope* inScope); GroundValue interpretGroundInstruction(GroundInstruction inst, GroundScope* scope); +void addVariable(GroundVariable **head, const char *id, GroundValue data);