summaryrefslogtreecommitdiffstats
path: root/eval.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2012-02-22 17:21:43 -0800
committerKaz Kylheku <kaz@kylheku.com>2012-02-22 17:21:43 -0800
commitad3a952d7dd471995270a0c044b1d22ca4da8585 (patch)
tree307d37f00e9e09d5a8fc38b445ce93858038eafd /eval.c
parente2f5aecbef1b41f65b65bd580531f5869d1e232f (diff)
downloadtxr-ad3a952d7dd471995270a0c044b1d22ca4da8585.tar.gz
txr-ad3a952d7dd471995270a0c044b1d22ca4da8585.tar.bz2
txr-ad3a952d7dd471995270a0c044b1d22ca4da8585.zip
* eval.c (dwim_loc): del operator's return value is the
deleted range of values. Missing del cases added for single index cases. * lib.c (quicksort): Fix pivot selection one more time. (length): Fix bad argument in "not a sequence" error.
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/eval.c b/eval.c
index e9ab5af3..7fc4fb58 100644
--- a/eval.c
+++ b/eval.c
@@ -753,8 +753,8 @@ static val *dwim_loc(val form, val env, val op, val newform, val *retval)
replace_str(obj, newval, car(index), cdr(index));
*retval = newval;
} else if (op == del_s) {
+ *retval = sub_str(obj, car(index), cdr(index));
replace_str(obj, nil, car(index), cdr(index));
- *retval = nil;
} else {
eval_error(form, lit("[~s ~s]: ranges allow only set and del operators"),
obj, index, nao);
@@ -779,11 +779,8 @@ static val *dwim_loc(val form, val env, val op, val newform, val *retval)
chr_str_set(obj, index, newval);
*retval = newval;
} else if (op == del_s) {
- if (lt(index, zero) || length_str_le(obj, index))
- eval_error(form, lit("[~s ~s]: index out of bounds"),
- obj, index, nao);
+ *retval = chr_str(obj, index);
replace_str(obj, nil, index, plus(index, one));
- *retval = nil;
} else {
eval_error(form, lit("[~s ~s]: only set, inc, dec and del can be "
"used for string indices"), obj, index, nao);
@@ -809,15 +806,20 @@ static val *dwim_loc(val form, val env, val op, val newform, val *retval)
replace_vec(obj, newval, car(index), cdr(index));
*retval = newval;
} else if (op == del_s) {
+ *retval = sub_vec(obj, car(index), cdr(index));
replace_vec(obj, nil, car(index), cdr(index));
- *retval = nil;
} else {
eval_error(form, lit("[~s ~s]: ranges allow only set and del operators"),
obj, index, nao);
}
return 0;
} else {
- return vecref_l(obj, first(args));
+ if (op == del_s) {
+ *retval = vecref(obj, index);
+ replace_vec(obj, nil, index, plus(index, one));
+ return 0;
+ }
+ return vecref_l(obj, index);
}
}
case CONS:
@@ -830,6 +832,11 @@ static val *dwim_loc(val form, val env, val op, val newform, val *retval)
val index = first(args);
val cell = obj;
if (bignump(index) || fixnump(index)) {
+ if (op == del_s) {
+ *retval = vecref(obj, index);
+ replace_list(obj, nil, index, plus(index, one));
+ return 0;
+ }
return listref_l(obj, index);
} else if (consp(index)) {
val newlist;
@@ -843,11 +850,11 @@ static val *dwim_loc(val form, val env, val op, val newform, val *retval)
op_modplace(tempform, env);
*retval = newval;
} else if (op == del_s) {
+ *retval = sub_list(obj, car(index), cdr(index));
newlist = replace_list(obj, nil, car(index), cdr(index));
tempform = list(op, second(form),
cons(quote_s, cons(newlist, nil)), nao);
op_modplace(tempform, env);
- *retval = nil;
} else {
eval_error(form, lit("[~s ~s]: ranges allow only set and del operators"),
obj, index, nao);