implemented type_of
This commit is contained in:
parent
ae3483c612
commit
50f90dcf84
|
|
@ -27,10 +27,11 @@ typedef enum {
|
||||||
STACK_CHARACTER,
|
STACK_CHARACTER,
|
||||||
STACK_BOOLEAN,
|
STACK_BOOLEAN,
|
||||||
STACK_TOKEN_STRING,
|
STACK_TOKEN_STRING,
|
||||||
STACK_CODE_BLOCK,
|
STACK_CALLABLE,
|
||||||
} StackType;
|
} StackType;
|
||||||
|
|
||||||
extern const char *STACK_TYPES_NAMES[];
|
extern const char *STACK_TYPES_NAMES[];
|
||||||
|
extern const char *STACK_TYPES_TYPES[];
|
||||||
extern const size_t STACK_TYPE_COUNT;
|
extern const size_t STACK_TYPE_COUNT;
|
||||||
|
|
||||||
typedef struct StackItem {
|
typedef struct StackItem {
|
||||||
|
|
|
||||||
|
|
@ -508,7 +508,7 @@ Boolean load_builtins(InterpreterState *interpreter_state) {
|
||||||
af = interpreter_state->stack->boolean; \
|
af = interpreter_state->stack->boolean; \
|
||||||
break; \
|
break; \
|
||||||
case STACK_TOKEN_STRING: \
|
case STACK_TOKEN_STRING: \
|
||||||
case STACK_CODE_BLOCK: \
|
case STACK_CALLABLE: \
|
||||||
return FALSE; \
|
return FALSE; \
|
||||||
} \
|
} \
|
||||||
|
|
||||||
|
|
@ -585,7 +585,7 @@ Boolean load_builtins(InterpreterState *interpreter_state) {
|
||||||
af = interpreter_state->stack->boolean; \
|
af = interpreter_state->stack->boolean; \
|
||||||
break; \
|
break; \
|
||||||
case STACK_TOKEN_STRING: \
|
case STACK_TOKEN_STRING: \
|
||||||
case STACK_CODE_BLOCK: \
|
case STACK_CALLABLE: \
|
||||||
return FALSE; \
|
return FALSE; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
|
|
@ -655,7 +655,7 @@ Boolean load_builtins(InterpreterState *interpreter_state) {
|
||||||
bf = interpreter_state->stack->next->boolean; \
|
bf = interpreter_state->stack->next->boolean; \
|
||||||
break; \
|
break; \
|
||||||
case STACK_TOKEN_STRING: \
|
case STACK_TOKEN_STRING: \
|
||||||
case STACK_CODE_BLOCK: \
|
case STACK_CALLABLE: \
|
||||||
return FALSE; \
|
return FALSE; \
|
||||||
} \
|
} \
|
||||||
|
|
||||||
|
|
@ -1490,7 +1490,7 @@ Boolean builtin_dup(InterpreterState *interpreter_state) {
|
||||||
item->boolean = interpreter_state->stack->boolean;
|
item->boolean = interpreter_state->stack->boolean;
|
||||||
break;
|
break;
|
||||||
case STACK_TOKEN_STRING:
|
case STACK_TOKEN_STRING:
|
||||||
case STACK_CODE_BLOCK:
|
case STACK_CALLABLE:
|
||||||
item->token_string = copy_token_string(interpreter_state->stack->token_string);
|
item->token_string = copy_token_string(interpreter_state->stack->token_string);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -1507,7 +1507,7 @@ Boolean builtin_eval(InterpreterState *interpreter_state) {
|
||||||
code_target->next = NULL;
|
code_target->next = NULL;
|
||||||
|
|
||||||
Boolean return_value = FALSE;
|
Boolean return_value = FALSE;
|
||||||
if (code_target->type == STACK_TOKEN_STRING || code_target->type == STACK_CODE_BLOCK)
|
if (code_target->type == STACK_TOKEN_STRING || code_target->type == STACK_CALLABLE)
|
||||||
return_value = execute_token_string(interpreter_state, code_target->token_string);
|
return_value = execute_token_string(interpreter_state, code_target->token_string);
|
||||||
else if (code_target->type == STACK_IDENTIFIER)
|
else if (code_target->type == STACK_IDENTIFIER)
|
||||||
return_value = execute_func(interpreter_state, code_target->identifier.name);
|
return_value = execute_func(interpreter_state, code_target->identifier.name);
|
||||||
|
|
@ -1536,13 +1536,13 @@ Boolean builtin_if(InterpreterState *interpreter_state) {
|
||||||
|
|
||||||
if (!(
|
if (!(
|
||||||
else_block->type == STACK_TOKEN_STRING ||
|
else_block->type == STACK_TOKEN_STRING ||
|
||||||
else_block->type == STACK_CODE_BLOCK ||
|
else_block->type == STACK_CALLABLE ||
|
||||||
else_block->type == STACK_IDENTIFIER
|
else_block->type == STACK_IDENTIFIER
|
||||||
)) return FALSE;
|
)) return FALSE;
|
||||||
|
|
||||||
if (!(
|
if (!(
|
||||||
then_block->type == STACK_TOKEN_STRING ||
|
then_block->type == STACK_TOKEN_STRING ||
|
||||||
then_block->type == STACK_CODE_BLOCK ||
|
then_block->type == STACK_CALLABLE ||
|
||||||
then_block->type == STACK_IDENTIFIER
|
then_block->type == STACK_IDENTIFIER
|
||||||
)) return FALSE;
|
)) return FALSE;
|
||||||
|
|
||||||
|
|
@ -1591,19 +1591,19 @@ Boolean builtin_if(InterpreterState *interpreter_state) {
|
||||||
value = conditional->boolean;
|
value = conditional->boolean;
|
||||||
break;
|
break;
|
||||||
case STACK_TOKEN_STRING:
|
case STACK_TOKEN_STRING:
|
||||||
case STACK_CODE_BLOCK:
|
case STACK_CALLABLE:
|
||||||
value = (conditional->token_string.length && conditional->token_string.tokens[0].type != TOKEN_EOF) ? TRUE : FALSE;
|
value = (conditional->token_string.length && conditional->token_string.tokens[0].type != TOKEN_EOF) ? TRUE : FALSE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
Boolean return_value = FALSE;
|
Boolean return_value = FALSE;
|
||||||
if (value) {
|
if (value) {
|
||||||
if (then_block->type == STACK_TOKEN_STRING || then_block->type == STACK_CODE_BLOCK)
|
if (then_block->type == STACK_TOKEN_STRING || then_block->type == STACK_CALLABLE)
|
||||||
return_value = execute_token_string(interpreter_state, then_block->token_string);
|
return_value = execute_token_string(interpreter_state, then_block->token_string);
|
||||||
else if (then_block->type == STACK_IDENTIFIER)
|
else if (then_block->type == STACK_IDENTIFIER)
|
||||||
return_value = execute_func(interpreter_state, then_block->identifier.name);
|
return_value = execute_func(interpreter_state, then_block->identifier.name);
|
||||||
} else {
|
} else {
|
||||||
if (else_block->type == STACK_TOKEN_STRING || else_block->type == STACK_CODE_BLOCK)
|
if (else_block->type == STACK_TOKEN_STRING || else_block->type == STACK_CALLABLE)
|
||||||
return_value = execute_token_string(interpreter_state, else_block->token_string);
|
return_value = execute_token_string(interpreter_state, else_block->token_string);
|
||||||
else if (else_block->type == STACK_IDENTIFIER)
|
else if (else_block->type == STACK_IDENTIFIER)
|
||||||
return_value = execute_func(interpreter_state, else_block->identifier.name);
|
return_value = execute_func(interpreter_state, else_block->identifier.name);
|
||||||
|
|
@ -1616,7 +1616,7 @@ Boolean builtin_if(InterpreterState *interpreter_state) {
|
||||||
Boolean builtin_lambda(InterpreterState *interpreter_state) {
|
Boolean builtin_lambda(InterpreterState *interpreter_state) {
|
||||||
if (interpreter_state->stack == NULL) return FALSE;
|
if (interpreter_state->stack == NULL) return FALSE;
|
||||||
if (interpreter_state->stack->type != STACK_TOKEN_STRING) return FALSE;
|
if (interpreter_state->stack->type != STACK_TOKEN_STRING) return FALSE;
|
||||||
interpreter_state->stack->type = STACK_CODE_BLOCK;
|
interpreter_state->stack->type = STACK_CALLABLE;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1756,7 +1756,7 @@ Boolean builtin_pick(InterpreterState *interpreter_state) {
|
||||||
item->boolean = picked->boolean;
|
item->boolean = picked->boolean;
|
||||||
break;
|
break;
|
||||||
case STACK_TOKEN_STRING:
|
case STACK_TOKEN_STRING:
|
||||||
case STACK_CODE_BLOCK:
|
case STACK_CALLABLE:
|
||||||
item->token_string = copy_token_string(picked->token_string);
|
item->token_string = copy_token_string(picked->token_string);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -1995,8 +1995,14 @@ Boolean builtin_tan(InterpreterState *interpreter_state) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Boolean builtin_type_of(InterpreterState *interpreter_state) {
|
Boolean builtin_type_of(InterpreterState *interpreter_state) {
|
||||||
(void)interpreter_state;
|
if (interpreter_state->stack == NULL) return FALSE;
|
||||||
return FALSE;
|
return push_token(interpreter_state, (Token){
|
||||||
|
.type = TOKEN_IDENTIFIER,
|
||||||
|
.identifier = (Identifier){
|
||||||
|
.is_literal = TRUE,
|
||||||
|
.name = sls_str_malloc(STACK_TYPES_TYPES[interpreter_state->stack->type], TYPE_NAMES_SAFE_LENGTH),
|
||||||
|
},
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Boolean builtin_while(InterpreterState *interpreter_state) {
|
Boolean builtin_while(InterpreterState *interpreter_state) {
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,25 @@ const char *STACK_TYPES_NAMES[] = {
|
||||||
"Character",
|
"Character",
|
||||||
"Boolean",
|
"Boolean",
|
||||||
"Token String",
|
"Token String",
|
||||||
|
"Callable",
|
||||||
|
};
|
||||||
|
|
||||||
|
const char *STACK_TYPES_TYPES[] = {
|
||||||
|
"Identifier",
|
||||||
|
"i64",
|
||||||
|
"i32",
|
||||||
|
"i16",
|
||||||
|
"i8",
|
||||||
|
"u64",
|
||||||
|
"u32",
|
||||||
|
"u16",
|
||||||
|
"u8",
|
||||||
|
"f32",
|
||||||
|
"f64",
|
||||||
|
"char",
|
||||||
|
"bool",
|
||||||
|
"TokenString",
|
||||||
|
"Callable",
|
||||||
};
|
};
|
||||||
|
|
||||||
const size_t STACK_TYPE_COUNT = sizeof(STACK_TYPES_NAMES) / sizeof(*STACK_TYPES_NAMES);
|
const size_t STACK_TYPE_COUNT = sizeof(STACK_TYPES_NAMES) / sizeof(*STACK_TYPES_NAMES);
|
||||||
|
|
@ -146,7 +165,7 @@ Boolean push_token(InterpreterState *interpreter_state, Token token) {
|
||||||
item->boolean = token.boolean_literal;
|
item->boolean = token.boolean_literal;
|
||||||
break;
|
break;
|
||||||
case STACK_TOKEN_STRING:
|
case STACK_TOKEN_STRING:
|
||||||
case STACK_CODE_BLOCK:
|
case STACK_CALLABLE:
|
||||||
item->token_string = copy_token_string(token.token_string);
|
item->token_string = copy_token_string(token.token_string);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -65,8 +65,8 @@ void print_top_of_stack(InterpreterState *interpreter_state) {
|
||||||
case STACK_TOKEN_STRING:
|
case STACK_TOKEN_STRING:
|
||||||
printf("#0: <TOKEN STRING>\n");
|
printf("#0: <TOKEN STRING>\n");
|
||||||
break;
|
break;
|
||||||
case STACK_CODE_BLOCK:
|
case STACK_CALLABLE:
|
||||||
printf("#0: <CODE BLOCK>\n");
|
printf("#0: <CALLABLE>\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue