summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2019-06-25 06:57:50 -0700
committerKaz Kylheku <kaz@kylheku.com>2019-06-25 06:57:50 -0700
commit988b2b2f018e02c02bf60fb93c4fa24a880b5a26 (patch)
treea7ab27808b629e2022333d446223280a852217a3 /lib.c
parent640a272f369406e7e433354959f4e8e53f68088f (diff)
downloadtxr-988b2b2f018e02c02bf60fb93c4fa24a880b5a26.tar.gz
txr-988b2b2f018e02c02bf60fb93c4fa24a880b5a26.tar.bz2
txr-988b2b2f018e02c02bf60fb93c4fa24a880b5a26.zip
Code clean-up in list collector functions.
* lib.c (list_collect, list_collect_append, list_collect_revappend): Use local variables to avoid repeated expressions. (list_collect_nconc): Only call nullify in necessary cases.
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c42
1 files changed, 23 insertions, 19 deletions
diff --git a/lib.c b/lib.c
index 95e7573c..57cdae51 100644
--- a/lib.c
+++ b/lib.c
@@ -1027,22 +1027,25 @@ val seqp(val obj)
loc list_collect(loc ptail, val obj)
{
- switch (type(deref(ptail))) {
+ val items = cons(obj, nil);
+ val tailobj = deref(ptail);
+
+ switch (type(tailobj)) {
case NIL:
- set(ptail, cons(obj, nil));
+ set(ptail, items);
return ptail;
case CONS:
case LCONS:
- ptail = tail(deref(ptail));
- set(ptail, cons(obj, nil));
+ ptail = tail(tailobj);
+ set(ptail, items);
return ptail;
case VEC:
- replace_vec(deref(ptail), cons(obj, nil), t, t);
+ replace_vec(tailobj, items, t, t);
return ptail;
case STR:
case LIT:
case LSTR:
- replace_str(deref(ptail), cons(obj, nil), t, t);
+ replace_str(tailobj, items, t, t);
return ptail;
default:
uw_throwf(error_s, lit("cannot append ~s"), deref(ptail), nao);
@@ -1052,16 +1055,15 @@ loc list_collect(loc ptail, val obj)
loc list_collect_nconc(loc ptail, val obj)
{
val tailobj = deref(ptail);
- obj = nullify(obj);
switch (type(tailobj)) {
case NIL:
- set(ptail, obj);
+ set(ptail, nullify(obj));
return ptail;
case CONS:
case LCONS:
ptail = tail(tailobj);
- set(ptail, obj);
+ set(ptail, nullify(obj));
return ptail;
case VEC:
replace_vec(tailobj, obj, t, t);
@@ -1119,11 +1121,12 @@ loc list_collect_append(loc ptail, val obj)
loc list_collect_nreconc(loc ptail, val obj)
{
val rev = nreverse(nullify(obj));
+ val tailobj = deref(ptail);
- switch (type(deref(ptail))) {
+ switch (type(tailobj)) {
case CONS:
case LCONS:
- ptail = tail(deref(ptail));
+ ptail = tail(tailobj);
/* fallthrough */
case NIL:
set(ptail, rev);
@@ -1135,15 +1138,15 @@ loc list_collect_nreconc(loc ptail, val obj)
return ptail;
}
case VEC:
- replace_vec(deref(ptail), rev, t, t);
+ replace_vec(tailobj, rev, t, t);
return ptail;
case STR:
case LIT:
case LSTR:
- replace_str(deref(ptail), rev, t, t);
+ replace_str(tailobj, rev, t, t);
return ptail;
default:
- uw_throwf(error_s, lit("cannot nconc ~s to ~s"), obj, deref(ptail), nao);
+ uw_throwf(error_s, lit("cannot nconc ~s to ~s"), obj, tailobj, nao);
}
}
@@ -1170,11 +1173,12 @@ loc list_collect_revappend(loc ptail, val obj)
{
val last;
obj = nullify(obj);
+ val tailobj = deref(ptail);
- switch (type(deref(ptail))) {
+ switch (type(tailobj)) {
case CONS:
case LCONS:
- set(ptail, copy_list(deref(ptail)));
+ set(ptail, copy_list(tailobj));
ptail = tail(deref(ptail));
/* fallthrough */
case NIL:
@@ -1192,17 +1196,17 @@ loc list_collect_revappend(loc ptail, val obj)
set(ptail, obj);
return ptail;
case VEC:
- set(ptail, copy_vec(deref(ptail)));
+ set(ptail, copy_vec(tailobj));
replace_vec(deref(ptail), reverse(obj), t, t);
return ptail;
case STR:
case LIT:
case LSTR:
- set(ptail, copy_str(deref(ptail)));
+ set(ptail, copy_str(tailobj));
replace_str(deref(ptail), reverse(obj), t, t);
return ptail;
default:
- uw_throwf(error_s, lit("cannot append to ~s"), deref(ptail), nao);
+ uw_throwf(error_s, lit("cannot append to ~s"), tailobj, nao);
}
}