diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2012-02-22 17:21:43 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2012-02-22 17:21:43 -0800 |
commit | ad3a952d7dd471995270a0c044b1d22ca4da8585 (patch) | |
tree | 307d37f00e9e09d5a8fc38b445ce93858038eafd /eval.c | |
parent | e2f5aecbef1b41f65b65bd580531f5869d1e232f (diff) | |
download | txr-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.c | 23 |
1 files changed, 15 insertions, 8 deletions
@@ -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); |