diff --git a/SLS_C/include/sls/interpreter.h b/SLS_C/include/sls/interpreter.h index c7dc4fb..5590259 100644 --- a/SLS_C/include/sls/interpreter.h +++ b/SLS_C/include/sls/interpreter.h @@ -72,6 +72,7 @@ typedef struct { } FunctionItem; Boolean push_token(InterpreterState *interpreter_state, Token token); +void clean_stack(StackItem *item); Boolean execute(InterpreterState *interpreter_state, LexerTokenResult *token); InterpreterState *interpreter_create(); diff --git a/SLS_C/src/builtin.c b/SLS_C/src/builtin.c index 9f34468..0cd682c 100644 --- a/SLS_C/src/builtin.c +++ b/SLS_C/src/builtin.c @@ -789,8 +789,12 @@ Boolean builtin_depth(InterpreterState *interpreter_state) { } Boolean builtin_drop(InterpreterState *interpreter_state) { - (void)interpreter_state; - return FALSE; + StackItem *node = interpreter_state->stack; + if (node == NULL) return FALSE; + interpreter_state->stack = node->next; + node->next = NULL; + clean_stack(node); + return TRUE; } Boolean builtin_dup(InterpreterState *interpreter_state) { diff --git a/SLS_C/src/interpreter.c b/SLS_C/src/interpreter.c index 09519cb..5d8b4b7 100644 --- a/SLS_C/src/interpreter.c +++ b/SLS_C/src/interpreter.c @@ -185,7 +185,7 @@ InterpreterState *interpreter_create() { return interpreter_state; } -static void clean_stack(StackItem *item) { +void clean_stack(StackItem *item) { if (item == NULL) return; if (item->type == STACK_TOKEN_STRING) clean_token_string(item->token_string); diff --git a/SLS_C/src/repl.c b/SLS_C/src/repl.c index 5ea6d7c..88be976 100644 --- a/SLS_C/src/repl.c +++ b/SLS_C/src/repl.c @@ -17,8 +17,10 @@ static const SlsStr REPL_FILE_NAME = SLS_STR_CONST(""); void print_top_of_stack(InterpreterState *interpreter_state) { - if (interpreter_state->stack == NULL) + if (interpreter_state->stack == NULL) { + printf("#0: \n"); return; + } switch (interpreter_state->stack->type) { case STACK_IDENTIFIER: printf("#0: ::%s\n", interpreter_state->stack->identifier.name.str);