summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoriamcheeseman <[email protected]>2026-04-14 21:16:29 -0400
committeriamcheeseman <[email protected]>2026-04-14 21:16:29 -0400
commit7663596a72347d8dab936c6503002d95149c04c9 (patch)
tree5d5e79bc7fe026433621d81fb672346902c62d72
parentcdd3aa45066a13598fbea92b404d33477929fea2 (diff)
microscript: update standard library
-rw-r--r--uscript/uscript.c52
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)