summaryrefslogtreecommitdiff
path: root/uscript/uscript.c
diff options
context:
space:
mode:
authoriamcheeseman <[email protected]>2026-04-14 19:35:49 -0400
committeriamcheeseman <[email protected]>2026-04-14 19:35:49 -0400
commit24e600e7c3ce6dab4c6c3f421e5d1ae35dc04bad (patch)
treeb3cf0267cb9cd9620b0c2279549300ec65108e72 /uscript/uscript.c
parentb60ad836c756f39eb5eafbfadae6847ee5ed5236 (diff)
microscript: add core:range()
Diffstat (limited to 'uscript/uscript.c')
-rw-r--r--uscript/uscript.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/uscript/uscript.c b/uscript/uscript.c
index a7e3ca1..0e6fc4b 100644
--- a/uscript/uscript.c
+++ b/uscript/uscript.c
@@ -36,12 +36,46 @@ void core_len(int argc)
}
}
+void core_range_next(int argc)
+{
+ (void)argc;
+
+ struct us_cfunc *cfunc = get_cfunc(vm_get(-1));
+ double min = get_num(cfunc_get_upval(cfunc, 0));
+ double max = get_num(cfunc_get_upval(cfunc, 1));
+
+ if (min == max) {
+ vm_push(create_zilch());
+ return;
+ }
+
+ vm_push(create_num(min));
+
+ int inc = max > min ? 1 : -1;
+ cfunc_set_upval(cfunc, 0, create_num(min + inc));
+}
+
+void core_range(int argc)
+{
+ if (vm_get(1).type != VAL_NUM || vm_get(2).type != VAL_NUM)
+ log_fatal(1, "core:range expected two numbers");
+
+ struct us_str *str = copy_str("rangenext", -1);
+ struct us_cfunc *cfunc = create_cfunc(str, core_range_next, 0);
+
+ for (int i = 0; i < argc; i++)
+ cfunc_add_upval(cfunc, vm_get(i));
+
+ 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);
}
void us_deinit(void)