Done with some things, saving here.
This commit is contained in:
parent
289243de38
commit
36fd838a8f
31
src/exec.c
31
src/exec.c
@ -39,10 +39,11 @@ AST* exec_exp(AST* ast, Scope* parent) {
|
|||||||
return ast_init(
|
return ast_init(
|
||||||
AST_TYPE_NUM, ast_num_data_init(*(ASTNumData*)ast->data)
|
AST_TYPE_NUM, ast_num_data_init(*(ASTNumData*)ast->data)
|
||||||
);
|
);
|
||||||
case AST_TYPE_VREF: return exec_vref(ast, parent);
|
case AST_TYPE_VREF: return exec_vref(ast, parent);
|
||||||
case AST_TYPE_VDEF: return exec_vdef(ast, parent);
|
case AST_TYPE_VDEF: return exec_vdef(ast, parent);
|
||||||
case AST_TYPE_FDEF: return exec_fdef(ast, parent);
|
case AST_TYPE_FDEF: return exec_fdef(ast, parent);
|
||||||
default: printf("what\n"); exit(1);
|
case AST_TYPE_LAMBDA: return exec_lambda(ast, parent);
|
||||||
|
default: printf("what\n"); exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -79,7 +80,8 @@ AST* exec_call(AST* ast, Scope* parent) {
|
|||||||
case AST_TYPE_BIF:
|
case AST_TYPE_BIF:
|
||||||
ASTBIFData bifdata = fdef->data;
|
ASTBIFData bifdata = fdef->data;
|
||||||
return bifdata(argc, argv, parent);
|
return bifdata(argc, argv, parent);
|
||||||
case AST_TYPE_FDEF: return exec_cf(fdef, argc, argv);
|
case AST_TYPE_FDEF: return exec_cf(fdef, argc, argv);
|
||||||
|
case AST_TYPE_LAMBDA: return exec_lambda_call(fdef, argc, argv);
|
||||||
default:
|
default:
|
||||||
return ast_init(AST_TYPE_EXC, ast_exc_data_init("Good job!", NULL));
|
return ast_init(AST_TYPE_EXC, ast_exc_data_init("Good job!", NULL));
|
||||||
}
|
}
|
||||||
@ -132,14 +134,29 @@ AST* exec_vref(AST* ast, Scope* parent) {
|
|||||||
AST* exec_fdef(AST* ast, Scope* parent) {
|
AST* exec_fdef(AST* ast, Scope* parent) {
|
||||||
ast->scope = scope_init(parent);
|
ast->scope = scope_init(parent);
|
||||||
ASTFDefData* fdef = (ASTFDefData*)ast->data;
|
ASTFDefData* fdef = (ASTFDefData*)ast->data;
|
||||||
log_dbgf("IS THIS SUSPICIOUS??? %i", fdef->body->type);
|
|
||||||
AST* val = ast;
|
AST* val = ast;
|
||||||
char* key = fdef->name;
|
char* key = fdef->name;
|
||||||
scope_add(parent, key, val);
|
scope_add(parent, key, val);
|
||||||
// TODO: Create lambda functions.
|
|
||||||
return fdef->body; // Function definitions return function body.
|
return fdef->body; // Function definitions return function body.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AST* exec_lambda(AST* ast, Scope* parent) {
|
||||||
|
// Executing a lambda on its own with no arguments returns itself.
|
||||||
|
return ast;
|
||||||
|
}
|
||||||
|
|
||||||
|
AST* exec_lambda_call(AST* ast, size_t argc, AST** argv) {
|
||||||
|
Scope* callscope = scope_init(ast->scope);
|
||||||
|
ASTFDefData* lambda = (ASTFDefData*)ast->data;
|
||||||
|
for (int i = 0; i < argc; i++) {
|
||||||
|
char* key = ((ASTArgData*)lambda->argv[i]->data)->name;
|
||||||
|
AST* val = argv[i];
|
||||||
|
scope_add(callscope, key, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
return exec_exp(lambda->body, callscope);
|
||||||
|
}
|
||||||
|
|
||||||
void exec_print(double n) { printf("= %lf\n", n); }
|
void exec_print(double n) { printf("= %lf\n", n); }
|
||||||
|
|
||||||
inline void exec_new_scope(AST* ast, Scope* inherit) {
|
inline void exec_new_scope(AST* ast, Scope* inherit) {
|
||||||
|
@ -142,6 +142,15 @@ exp:
|
|||||||
$$ = ast_init(AST_TYPE_LAMBDA, ast_lambda_data_init(argc, argv, $5));
|
$$ = ast_init(AST_TYPE_LAMBDA, ast_lambda_data_init(argc, argv, $5));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
// Inline call.
|
||||||
|
| exp GROUPS arg GROUPE {
|
||||||
|
size_t argc = $3->ln;
|
||||||
|
AST** argv = $3->buf;
|
||||||
|
argarr_destroypsv($3);
|
||||||
|
$$ = ast_init(AST_TYPE_CALL, ($1, argc, argv));
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
| BLOCKS block BLOCKE {
|
| BLOCKS block BLOCKE {
|
||||||
$$ = ast_init(AST_TYPE_BLOCK, ast_block_data_init((AST**) $2->buf, $2->ln));
|
$$ = ast_init(AST_TYPE_BLOCK, ast_block_data_init((AST**) $2->buf, $2->ln));
|
||||||
|
@ -86,13 +86,6 @@ ASTBIFData* ast_bif_data_init(AST* fn(size_t, AST**, Scope*));
|
|||||||
// Destroy an `ASTBIFData`.
|
// Destroy an `ASTBIFData`.
|
||||||
void ast_bif_data_destroy(ASTBIFData* bif);
|
void ast_bif_data_destroy(ASTBIFData* bif);
|
||||||
|
|
||||||
/*
|
|
||||||
* // A list of arguments.
|
|
||||||
typedef struct {
|
|
||||||
size_t argc;
|
|
||||||
AST** argv;
|
|
||||||
} Args;
|
|
||||||
*/
|
|
||||||
// A call (to a function).
|
// A call (to a function).
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char* to; // What the call's to.
|
char* to; // What the call's to.
|
||||||
|
@ -20,6 +20,10 @@ AST* exec_vdef(AST* ast, Scope* parent);
|
|||||||
AST* exec_vref(AST* ast, Scope* parent);
|
AST* exec_vref(AST* ast, Scope* parent);
|
||||||
// Execute a function definition.
|
// Execute a function definition.
|
||||||
AST* exec_fdef(AST* ast, Scope* parent);
|
AST* exec_fdef(AST* ast, Scope* parent);
|
||||||
|
// Execute a lambda expression.
|
||||||
|
AST* exec_lambda(AST* ast, Scope* parent);
|
||||||
|
// Execute a lambda call.
|
||||||
|
AST* exec_lambda_call(AST* ast, size_t argc, AST** argv);
|
||||||
// Print the result of an execution.
|
// Print the result of an execution.
|
||||||
void exec_print(double n);
|
void exec_print(double n);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user