summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c51
1 files changed, 50 insertions, 1 deletions
diff --git a/lib.c b/lib.c
index 0503d615..e9f4b630 100644
--- a/lib.c
+++ b/lib.c
@@ -288,7 +288,6 @@ val rplaca(val cons, val new_car)
}
}
-
val rplacd(val cons, val new_cdr)
{
switch (type(cons)) {
@@ -303,6 +302,18 @@ val rplacd(val cons, val new_cdr)
}
}
+val sys_rplaca(val cons, val new_car)
+{
+ (void) rplaca(cons, new_car);
+ return new_car;
+}
+
+val sys_rplacd(val cons, val new_car)
+{
+ (void) rplacd(cons, new_car);
+ return new_car;
+}
+
loc car_l(val cons)
{
switch (type(cons)) {
@@ -6269,6 +6280,9 @@ val ref(val seq, val ind)
return chr_str(seq, ind);
case VEC:
return vecref(seq, ind);
+ case COBJ:
+ if (seq->co.cls == hash_s)
+ return gethash(seq, ind);
default:
type_mismatch(lit("ref: ~s is not a sequence"), seq, nao);
}
@@ -6287,6 +6301,9 @@ val refset(val seq, val ind, val newval)
return chr_str_set(seq, ind, newval);
case VEC:
return set(vecref_l(seq, ind), newval);
+ case COBJ:
+ if (seq->co.cls == hash_s)
+ return sethash(seq, ind, newval);
default:
type_mismatch(lit("ref: ~s is not a sequence"), seq, nao);
}
@@ -6311,6 +6328,38 @@ val replace(val seq, val items, val from, val to)
}
}
+val dwim_set(val seq, val ind_range, val newval)
+{
+ if (consp(ind_range)) {
+ cons_bind (x, y, ind_range);
+
+ if (atom(y))
+ return replace(seq, newval, x, y);
+ return replace(seq, newval, ind_range, colon_k);
+ } else if (vectorp(ind_range)) {
+ return replace(seq, newval, ind_range, colon_k);
+ } else{
+ (void) refset(seq, ind_range, newval);
+ return seq;
+ }
+
+ return newval;
+}
+
+val dwim_del(val seq, val ind_range)
+{
+ if (consp(ind_range)) {
+ return replace(seq, nil, car(ind_range), cdr(ind_range));
+ } else {
+ if (hashp(seq)) {
+ (void) remhash(seq, ind_range);
+ return seq;
+ } else {
+ return replace(seq, nil, ind_range, succ(ind_range));
+ }
+ }
+}
+
val update(val seq, val fun)
{
switch (type(seq)) {