summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2014-02-14 17:42:08 -0800
committerKaz Kylheku <kaz@kylheku.com>2014-02-14 17:42:08 -0800
commit6b4e2804f2da87aa3d15d407acc9b774a01d1555 (patch)
tree82d5a1768cb57c743f53a398cb141b3fded30fda
parenta4b872687408e7624ccb500fbce8467ae3f821e6 (diff)
downloadtxr-6b4e2804f2da87aa3d15d407acc9b774a01d1555.tar.gz
txr-6b4e2804f2da87aa3d15d407acc9b774a01d1555.tar.bz2
txr-6b4e2804f2da87aa3d15d407acc9b774a01d1555.zip
Replacing acons_new_l and aconsq_new_l interfaces with ones
that return the new or old cons cell rather than a pointer to its cdr field. * eval.c (transform_op): use of acons_new_l replaced with acons_new_c. * hash.c (struct hash): acons_new_l_fun member replaced with acons_new_c_fun. (make_hash, make_similar_hash): initialize acons_new_l_fun member using either acons_new_c or aconsql_new_c. (gethash_l): function becomes an inline in hash.h. (gethash_c): new function, based on gethash_l. (inhash, gethash_n): updated w.r.t struct hash change. * hash.h (gethash_c): declared. (gethash_l): becomes an inline wrapper for gethash_c. * lib.c (acons_new_l, aconsql_new_l): functions removed. (acons_new_c, aconsql_new_c): new functions. (obj_init): use gethash_c and rplacd instead of gethash_l and set. * lib.h (acons_new_l, aconsql_new_l): declarations removed. (acons_new_c, aconsql_new_c): declared.
-rw-r--r--ChangeLog28
-rw-r--r--eval.c5
-rw-r--r--hash.c20
-rw-r--r--hash.h7
-rw-r--r--lib.c19
-rw-r--r--lib.h4
6 files changed, 59 insertions, 24 deletions
diff --git a/ChangeLog b/ChangeLog
index 02d0323b..e6ba7b53 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,33 @@
2014-02-14 Kaz Kylheku <kaz@kylheku.com>
+ Replacing acons_new_l and aconsq_new_l interfaces with ones
+ that return the new or old cons cell rather than a pointer
+ to its cdr field.
+
+ * eval.c (transform_op): use of acons_new_l replaced with
+ acons_new_c.
+
+ * hash.c (struct hash): acons_new_l_fun member replaced
+ with acons_new_c_fun.
+ (make_hash, make_similar_hash): initialize acons_new_l_fun
+ member using either acons_new_c or aconsql_new_c.
+ (gethash_l): function becomes an inline in hash.h.
+ (gethash_c): new function, based on gethash_l.
+ (inhash, gethash_n): updated w.r.t struct hash change.
+
+ * hash.h (gethash_c): declared.
+ (gethash_l): becomes an inline wrapper for gethash_c.
+
+ * lib.c (acons_new_l, aconsql_new_l): functions removed.
+ (acons_new_c, aconsql_new_c): new functions.
+ (obj_init): use gethash_c and rplacd instead of gethash_l
+ and set.
+
+ * lib.h (acons_new_l, aconsql_new_l): declarations removed.
+ (acons_new_c, aconsql_new_c): declared.
+
+2014-02-14 Kaz Kylheku <kaz@kylheku.com>
+
* hash.c (inhash): Simplify code with gethash_f.
2014-02-14 Kaz Kylheku <kaz@kylheku.com>
diff --git a/eval.c b/eval.c
index bb2365bf..a79be121 100644
--- a/eval.c
+++ b/eval.c
@@ -1597,8 +1597,9 @@ static val transform_op(val forms, val syms, val rg)
if (integerp(vararg)) {
val newsyms = syms;
val new_p;
- val *place = acons_new_l(vararg, &new_p, &newsyms);
- val sym = if3(new_p, set(*place, gensym(format_op_arg(vararg))), *place);
+ val cell = acons_new_c(vararg, &new_p, &newsyms);
+ val sym = if3(new_p, rplacd(cell, gensym(format_op_arg(vararg))),
+ cdr(cell));
cons_bind (outsyms, outforms, transform_op(re, newsyms, rg));
return cons(outsyms, rlcp(cons(sym, outforms), outforms));
} else if (eq(vararg, rest_s)) {
diff --git a/hash.c b/hash.c
index c0c66114..354d250d 100644
--- a/hash.c
+++ b/hash.c
@@ -57,7 +57,7 @@ struct hash {
cnum (*hash_fun)(val);
val (*equal_fun)(val, val);
val (*assoc_fun)(val key, val list);
- val *(*acons_new_l_fun)(val key, val *new_p, val *list);
+ val (*acons_new_c_fun)(val key, val *new_p, val *list);
};
struct hash_iter {
@@ -471,7 +471,7 @@ val make_hash(val weak_keys, val weak_vals, val equal_based)
h->hash_fun = equal_based ? equal_hash : eql_hash;
h->equal_fun = equal_based ? equal : eql;
h->assoc_fun = equal_based ? assoc : assql;
- h->acons_new_l_fun = equal_based ? acons_new_l : aconsql_new_l;
+ h->acons_new_c_fun = equal_based ? acons_new_c : aconsql_new_c;
return hash;
}
@@ -494,7 +494,7 @@ val make_similar_hash(val existing)
h->hash_fun = ex->hash_fun;
h->equal_fun = ex->equal_fun;
h->assoc_fun = ex->assoc_fun;
- h->acons_new_l_fun = ex->acons_new_l_fun;
+ h->acons_new_c_fun = ex->acons_new_c_fun;
return hash;
}
@@ -515,7 +515,7 @@ val copy_hash(val existing)
h->flags = ex->flags;
h->hash_fun = ex->hash_fun;
h->assoc_fun = ex->assoc_fun;
- h->acons_new_l_fun = ex->acons_new_l_fun;
+ h->acons_new_c_fun = ex->acons_new_c_fun;
for (iter = zero; lt(iter, mod); iter = plus(iter, one))
*vecref_l(h->table, iter) = copy_alist(vecref(ex->table, iter));
@@ -523,15 +523,15 @@ val copy_hash(val existing)
return hash;
}
-val *gethash_l(val hash, val key, val *new_p)
+val gethash_c(val hash, val key, val *new_p)
{
struct hash *h = (struct hash *) cobj_handle(hash, hash_s);
val *pchain = vecref_l(h->table, num_fast(h->hash_fun(key) % h->modulus));
val old = *pchain;
- val *place = h->acons_new_l_fun(key, new_p, pchain);
+ val cell = h->acons_new_c_fun(key, new_p, pchain);
if (old != *pchain && ++h->count > 2 * h->modulus)
hash_grow(h);
- return place;
+ return cell;
}
val gethash(val hash, val key)
@@ -552,11 +552,11 @@ val inhash(val hash, val key, val init)
struct hash *h = (struct hash *) cobj_handle(hash, hash_s);
val *pchain = vecref_l(h->table, num_fast(h->hash_fun(key) % h->modulus));
val old = *pchain, new_p;
- val *place = h->acons_new_l_fun(key, &new_p, pchain);
+ val cell = h->acons_new_c_fun(key, &new_p, pchain);
if (old != *pchain && ++h->count > 2 * h->modulus)
hash_grow(h);
if (new_p)
- *place = init;
+ rplacd(cell, init);
found = h->assoc_fun(key, *pchain);
}
@@ -582,7 +582,7 @@ val gethash_n(val hash, val key, val notfound_val)
val sethash(val hash, val key, val value)
{
val new_p;
- set(*gethash_l(hash, key, &new_p), value);
+ rplacd(gethash_c(hash, key, &new_p), value);
return new_p;
}
diff --git a/hash.h b/hash.h
index 0b293801..e90fccd4 100644
--- a/hash.h
+++ b/hash.h
@@ -29,7 +29,7 @@ extern val weak_keys_k, weak_vals_k, equal_based_k;
val make_hash(val weak_keys, val weak_vals, val equal_based);
val make_similar_hash(val existing);
val copy_hash(val existing);
-val *gethash_l(val hash, val key, val *new_p);
+val gethash_c(val hash, val key, val *new_p);
val gethash(val hash, val key);
val inhash(val hash, val key, val init);
val gethash_n(val hash, val key, val notfound_val);
@@ -61,4 +61,9 @@ val hash_update_1(val hash, val key, val fun, val init);
void hash_process_weak(void);
+INLINE val *gethash_l(val hash, val key, val *new_p)
+{
+ return cdr_l(gethash_c(hash, key, new_p));
+}
+
void hash_init(void);
diff --git a/lib.c b/lib.c
index 64dfb7d0..b1e8b39f 100644
--- a/lib.c
+++ b/lib.c
@@ -4468,20 +4468,20 @@ val acons_new(val key, val value, val list)
}
}
-val *acons_new_l(val key, val *new_p, val *list)
+val acons_new_c(val key, val *new_p, val *list)
{
val existing = assoc(key, *list);
if (existing) {
if (new_p)
*new_p = nil;
- return cdr_l(existing);
+ return existing;
} else {
val nc = cons(key, nil);
set(*list, cons(nc, *list));
if (new_p)
*new_p = t;
- return cdr_l(nc);
+ return nc;
}
}
@@ -4497,20 +4497,20 @@ val aconsql_new(val key, val value, val list)
}
}
-val *aconsql_new_l(val key, val *new_p, val *list)
+val aconsql_new_c(val key, val *new_p, val *list)
{
val existing = assql(key, *list);
if (existing) {
if (new_p)
*new_p = nil;
- return cdr_l(existing);
+ return existing;
} else {
val nc = cons(key, nil);
set(*list, cons(nc, *list));
if (new_p)
*new_p = t;
- return cdr_l(nc);
+ return nc;
}
}
@@ -5073,10 +5073,11 @@ static void obj_init(void)
/* nil can't be interned because it's not a SYM object;
it works as a symbol because the nil case is handled by
symbol-manipulating function. */
- *gethash_l(user_package->pk.symhash, nil_string, 0) = nil;
+ rplacd(gethash_c(user_package->pk.symhash, nil_string, 0), nil);
- /* t can't be interned, because gethash_l needs t in order to do its job. */
- t = set(*gethash_l(user_package->pk.symhash, lit("t"), 0), make_sym(lit("t")));
+ /* t can't be interned, because intern needs t in order to do its job. */
+ t = rplacd(gethash_c(user_package->pk.symhash,
+ lit("t"), 0), make_sym(lit("t")));
set(t->s.package, user_package);
null = intern(lit("null"), user_package);
diff --git a/lib.h b/lib.h
index 77ca800d..32d26eb3 100644
--- a/lib.h
+++ b/lib.h
@@ -662,9 +662,9 @@ val assoc(val key, val list);
val assql(val key, val list);
val acons(val car, val cdr, val list);
val acons_new(val key, val value, val list);
-val *acons_new_l(val key, val *new_p, val *list);
+val acons_new_c(val key, val *new_p, val *list);
val aconsql_new(val key, val value, val list);
-val *aconsql_new_l(val key, val *new_p, val *list);
+val aconsql_new_c(val key, val *new_p, val *list);
val alist_remove(val list, val keys);
val alist_remove1(val list, val key);
val alist_nremove(val list, val keys);