diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2019-08-07 06:25:55 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2019-08-07 06:25:55 -0700 |
commit | 7abdb7132afa0f5d8351c1a04d8fc819de3f1ea1 (patch) | |
tree | 7646a67b462a9f0673a06eb504abc229abffa934 /match.c | |
parent | fae5d29a6548c4eacfc2f463d220857d1d1f05a5 (diff) | |
download | txr-7abdb7132afa0f5d8351c1a04d8fc819de3f1ea1.tar.gz txr-7abdb7132afa0f5d8351c1a04d8fc819de3f1ea1.tar.bz2 txr-7abdb7132afa0f5d8351c1a04d8fc819de3f1ea1.zip |
@(collect)/@(coll): streamline list accumulation code.
* match.c (h_coll, v_collect): Revising the code for
accumulating items into lists. Duplicate assoc lookups via
assoc and acons_new are eliminated in favor of doing rplacd or
acons. We don't call assoc to look up a binding if have_vars
is false. car(binding) is called once and captured in the
local vaiable sym.
Diffstat (limited to 'match.c')
-rw-r--r-- | match.c | 27 |
1 files changed, 17 insertions, 10 deletions
@@ -1087,13 +1087,16 @@ static val h_coll(match_line_ctx *c) for (iter = strictly_new_bindings; iter; iter = cdr(iter)) { val binding = car(iter); - val vars_binding = assoc(car(binding), vars); + val sym = car(binding); - if (!have_vars || vars_binding) { - val existing = assoc(car(binding), bindings_coll); - bindings_coll = acons_new(car(binding), - cons(cdr(binding), cdr(existing)), - bindings_coll); + if (!have_vars || assoc(sym, vars)) { + val existing = assoc(sym, bindings_coll); + val newlist = cons(cdr(binding), cdr(existing)); + + if (existing) + rplacd(existing, newlist); + else + bindings_coll = acons(sym, newlist, bindings_coll); } } } @@ -3429,12 +3432,16 @@ static val v_collect(match_files_ctx *c) for (iter = strictly_new_bindings; iter; iter = cdr(iter)) { val binding = car(iter); - val vars_binding = assoc(car(binding), vars); + val sym = car(binding); - if (!have_vars || vars_binding) { - val existing = assoc(car(binding), bindings_coll); + if (!have_vars || assoc(sym, vars)) { + val existing = assoc(sym, bindings_coll); + val newlist = cons(cdr(binding), cdr(existing)); - bindings_coll = acons_new(car(binding), cons(cdr(binding), cdr(existing)), bindings_coll); + if (existing) + rplacd(existing, newlist); + else + bindings_coll = acons(sym, newlist, bindings_coll); } } } |