diff options
| author | iamcheeseman <[email protected]> | 2026-04-14 21:16:29 -0400 |
|---|---|---|
| committer | iamcheeseman <[email protected]> | 2026-04-14 21:16:29 -0400 |
| commit | 7663596a72347d8dab936c6503002d95149c04c9 (patch) | |
| tree | 5d5e79bc7fe026433621d81fb672346902c62d72 /uscript/uscript.c | |
| parent | cdd3aa45066a13598fbea92b404d33477929fea2 (diff) | |
microscript: update standard library
Diffstat (limited to 'uscript/uscript.c')
| -rw-r--r-- | uscript/uscript.c | 52 |
1 files changed, 51 insertions, 1 deletions
diff --git a/uscript/uscript.c b/uscript/uscript.c index d82ce35..02dc69e 100644 --- a/uscript/uscript.c +++ b/uscript/uscript.c @@ -69,13 +69,63 @@ void core_range(int argc) vm_push(wrap_cfunc(cfunc)); } +void arr_add(int argc) +{ + (void)argc; + + if (vm_get(0).type != VAL_ARR) + log_fatal(1, "arr:add expected an array"); + + struct us_arr *arr = get_arr(vm_get(0)); + da_append(struct us_val, &arr->e, vm_get(1)); +} + +void arr_iter_next(int argc) +{ + (void)argc; + + struct us_cfunc *cfunc = get_cfunc(vm_get(-1)); + struct us_arr *arr = get_arr(cfunc_get_upval(cfunc, 0)); + double i = get_num(cfunc_get_upval(cfunc, 1)); + + int len = da_len(arr->e); + + if (i == len) { + vm_push(create_zilch()); + return; + } + + vm_push(arr->e[(int)i]); + + cfunc_set_upval(cfunc, 1, create_num(i + 1)); +} + +void arr_iter(int argc) +{ + (void)argc; + + if (vm_get(0).type != VAL_ARR) + log_fatal(1, "arr:iter expected an array"); + + struct us_str *str = copy_str("arr:iternext", -1); + struct us_cfunc *cfunc = create_cfunc(str, arr_iter_next, 0); + + cfunc_add_upval(cfunc, vm_get(0)); + cfunc_add_upval(cfunc, create_num(0)); + + vm_push(wrap_cfunc(cfunc)); +} + void us_init(void) { init_vm(); us_set_cfunc("core:len", core_len, 1); us_set_cfunc("core:log", core_print, 1); - us_set_cfunc("core:range", core_range, 2); + us_set_cfunc("core:range", core_range, 3); + + us_set_cfunc("arr:iter", arr_iter, 1); + us_set_cfunc("arr:add", arr_add, 2); } void us_deinit(void) |
