Added sub to the builtin functions.
This commit is contained in:
parent
109bcb3fa5
commit
38c6a9113c
@ -21,3 +21,27 @@ AST* builtin_sum(size_t argc, AST** argv) {
|
|||||||
|
|
||||||
return ast_init(AST_TYPE_NUM, ast_num_data_init(total));
|
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));
|
||||||
|
}
|
||||||
|
@ -22,6 +22,10 @@ AST* exec_start(AST* ast) {
|
|||||||
global, "sum", ast_init(AST_TYPE_BIF, ast_bif_data_init(builtin_sum))
|
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`.
|
// Push global namespace to `scope`.
|
||||||
stack_push(scope, global);
|
stack_push(scope, global);
|
||||||
|
|
||||||
@ -74,7 +78,7 @@ AST* exec_call(AST* ast) {
|
|||||||
case AST_TYPE_BIF:
|
case AST_TYPE_BIF:
|
||||||
ASTBIFData bifdata = fdef->data;
|
ASTBIFData bifdata = fdef->data;
|
||||||
return bifdata(argc, argv);
|
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!"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,7 +6,12 @@
|
|||||||
// Sum some nums.
|
// Sum some nums.
|
||||||
AST* builtin_sum(size_t argc, AST** argv);
|
AST* builtin_sum(size_t argc, AST** argv);
|
||||||
|
|
||||||
|
// Subtract nums.
|
||||||
|
AST* builtin_sub(size_t argc, AST** argv);
|
||||||
|
|
||||||
// The list of built-in functions.
|
// 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
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user