#include "builtins.h" #include "node.h" #include "path.h" #include "module.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 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); }