summaryrefslogtreecommitdiff
path: root/src/library.c
diff options
context:
space:
mode:
authorLLLL Colonq <llll@colonq>2025-12-19 21:01:18 -0500
committerLLLL Colonq <llll@colonq>2025-12-19 21:01:18 -0500
commit2dfa52e475fbc5614f92cfbc42d5b25fc5b8eff2 (patch)
tree01109ae3e8748aeb784bdd97925af3e942fde316 /src/library.c
parent8612ca228aacb3e770c485d851c809ddc4a5a7b2 (diff)
Add support for keywords and variadic arguments
Diffstat (limited to 'src/library.c')
-rw-r--r--src/library.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/src/library.c b/src/library.c
index 3175e27..9a40646 100644
--- a/src/library.c
+++ b/src/library.c
@@ -322,6 +322,22 @@ void pit_install_library_io(pit_runtime *rt) {
pit_fset(rt, pit_intern_cstr(rt, "load!"), pit_nativefunc_new(rt, impl_load));
}
+static pit_value impl_plist_get(pit_runtime *rt, pit_value args) {
+ pit_value k = pit_car(rt, args);
+ pit_value vs = pit_car(rt, pit_cdr(rt, args));
+ while (vs != PIT_NIL) {
+ if (pit_eq(k, pit_car(rt, vs))) {
+ return pit_car(rt, pit_cdr(rt, vs));
+ }
+ vs = pit_cdr(rt, vs);
+ }
+ return PIT_NIL;
+}
+void pit_install_library_plist(pit_runtime *rt) {
+ /* property lists / keyword arguments */
+ pit_fset(rt, pit_intern_cstr(rt, "plist/get"), pit_nativefunc_new(rt, impl_plist_get));
+}
+
struct bytestring {
i64 len, cap;
u8 *data;
@@ -373,8 +389,10 @@ static pit_value impl_bs_delete(pit_runtime *rt, pit_value args) {
return PIT_NIL;
}
struct bytestring *bs = h->in.nativedata.data;
- if (bs->data) free(bs->data); bs->data = NULL;
- free(bs); h->in.nativedata.data = NULL;
+ if (bs->data) free(bs->data);
+ bs->data = NULL;
+ free(bs);
+ h->in.nativedata.data = NULL;
return PIT_T;
}
static pit_value impl_bs_grow(pit_runtime *rt, pit_value args) {
@@ -390,6 +408,7 @@ static pit_value impl_bs_grow(pit_runtime *rt, pit_value args) {
}
bs->len = sz;
}
+ return v;
}
static pit_value impl_bs_spit(pit_runtime *rt, pit_value args) {
pit_value path = pit_car(rt, args);