Added sub to the builtin functions.

This commit is contained in:
Jacob Signorovitch 2025-02-25 08:04:43 -05:00
parent 109bcb3fa5
commit 38c6a9113c
3 changed files with 35 additions and 2 deletions

View File

@ -21,3 +21,27 @@ AST* builtin_sum(size_t argc, AST** argv) {
return ast_init(AST_TYPE_NUM, ast_num_data_init(total));
}
AST* builtin_sub(size_t argc, AST** argv) {
log_dbg("Got here");
AST* first = *argv;
if (first->type != AST_TYPE_NUM)
return ast_init(
AST_TYPE_EXC, ast_exc_data_init("Can't subtract non-num arguments.")
);
ASTNumData total = *(ASTNumData*)first->data;
for (int i = 1; i < argc; i++) {
AST* arg = argv[i];
if (arg->type != AST_TYPE_NUM)
return ast_init(
AST_TYPE_EXC,
ast_exc_data_init("Can't subtract non-num arguments.")
);
total -= *(ASTNumData*)arg->data;
}
return ast_init(AST_TYPE_NUM, ast_num_data_init(total));
}

View File

@ -22,6 +22,10 @@ AST* exec_start(AST* ast) {
global, "sum", ast_init(AST_TYPE_BIF, ast_bif_data_init(builtin_sum))
);
htab_ins(
global, "sub", ast_init(AST_TYPE_BIF, ast_bif_data_init(builtin_sub))
);
// Push global namespace to `scope`.
stack_push(scope, global);
@ -74,7 +78,7 @@ AST* exec_call(AST* ast) {
case AST_TYPE_BIF:
ASTBIFData bifdata = fdef->data;
return bifdata(argc, argv);
default: return ast_init(AST_TYPE_EXC, ast_exc_data_init("Good job"));
default: return ast_init(AST_TYPE_EXC, ast_exc_data_init("Good job!"));
}
}

View File

@ -6,7 +6,12 @@
// Sum some nums.
AST* builtin_sum(size_t argc, AST** argv);
// Subtract nums.
AST* builtin_sub(size_t argc, AST** argv);
// The list of built-in functions.
static AST* (*builtin_fns[])(size_t argc, AST** argv) = {builtin_sum};
static AST* (*builtin_fns[])(size_t argc, AST** argv) = {
builtin_sum, builtin_sub
};
#endif