#include "builtins.h" #include "node.h" #include "path.h" #include "module.h" #include "moka.h" void register_builtins(struct moka* moka) { assert(moka); moka_decl_native(moka, "println", mk_println); moka_decl_native(moka, "define", mk_define); moka_decl_native(moka, "array", mk_array); moka_decl_native(moka, "assert-eqv!", mk_assert_eqv_mut); } MOKA mk_println(struct moka* moka, struct vec* args) { assert(moka); assert(args); int line = 0; for (size_t i=0; isize; i++) { MOKA val = (MOKA) args->data[i]; if (i > 0) { printf(" "); } else { line = moka_get_lazy(moka, val)->line; } moka_dump(moka, MK_EVAL(val)); } printf("\n"); return moka_push_int(moka, 0, line); } MOKA mk_define(struct moka* moka, struct vec* args) { assert(moka); assert(args); assert(args->size == 2); MOKA target = (MOKA) args->data[0]; MOKA value = MK_EVAL((MOKA) args->data[1]); struct node* node = moka_get_lazy(moka, target); moka_push(moka, value); assert(node->token); moka_decl_var(moka, node->token->value, value); return value; } MOKA mk_array(struct moka* moka, struct vec* args) { assert(moka); assert(args); for (size_t i=0; isize; i++) { MOKA arg = (MOKA) args->data[i]; MOKA val = MK_EVAL(arg); moka_push(moka, val); } moka_make_array(moka, args->size); return moka_top(moka); } MOKA mk_assert_eqv_mut(struct moka* moka, struct vec* args) { assert(moka); assert(args); MOKA lhs = MK_EVAL((MOKA) args->data[0]); MOKA rhs = MK_EVAL((MOKA) args->data[1]); int line = moka_line(moka, lhs); char lhs_buf[MK_STRLEN]; moka_str(moka, lhs, lhs_buf, MK_STRLEN); char rhs_buf[MK_STRLEN]; moka_str(moka, rhs, rhs_buf, MK_STRLEN); if (!moka_is_eqv(moka, lhs, rhs)) { status_push(moka->status, STATUS_ERROR, line, "assertion failed\nlhs = %s\nrhs = %s", lhs_buf, rhs_buf); return moka_push_bool(moka, false, line); } return moka_push_bool(moka, true, line); }