Done with some things, saving here.

This commit is contained in:
Jacob Signorovitch 2025-06-28 12:05:07 -04:00
parent 289243de38
commit 36fd838a8f
4 changed files with 37 additions and 14 deletions

View File

@ -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) {

View File

@ -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));

View File

@ -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.

View File

@ -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);