49 lines
1.0 KiB
C
49 lines
1.0 KiB
C
|
#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 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;
|
||
|
}
|