moka/lib/builtins.c

67 lines
1.4 KiB
C
Raw Normal View History

2024-03-29 04:46:35 +00:00
#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);
2024-03-29 20:11:46 +00:00
moka_decl_native(moka, "array", mk_array);
2024-03-29 04:46:35 +00:00
}
MOKA mk_println(struct moka* moka, struct vec* args)
{
assert(moka);
assert(args);
int line = 0;
for (size_t i=0; i<args->size; 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;
}
2024-03-29 20:11:46 +00:00
MOKA mk_array(struct moka* moka, struct vec* args)
{
assert(moka);
assert(args);
for (size_t i=0; i<args->size; 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);
}