diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2014-02-14 17:42:08 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2014-02-14 17:42:08 -0800 |
commit | 6b4e2804f2da87aa3d15d407acc9b774a01d1555 (patch) | |
tree | 82d5a1768cb57c743f53a398cb141b3fded30fda | |
parent | a4b872687408e7624ccb500fbce8467ae3f821e6 (diff) | |
download | txr-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-- | ChangeLog | 28 | ||||
-rw-r--r-- | eval.c | 5 | ||||
-rw-r--r-- | hash.c | 20 | ||||
-rw-r--r-- | hash.h | 7 | ||||
-rw-r--r-- | lib.c | 19 | ||||
-rw-r--r-- | lib.h | 4 |
6 files changed, 59 insertions, 24 deletions
@@ -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> @@ -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)) { @@ -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; } @@ -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); @@ -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); @@ -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); |