From 7abdb7132afa0f5d8351c1a04d8fc819de3f1ea1 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Wed, 7 Aug 2019 06:25:55 -0700 Subject: @(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. --- match.c | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) (limited to 'match.c') diff --git a/match.c b/match.c index a543634f..5937130f 100644 --- a/match.c +++ b/match.c @@ -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); } } } -- cgit v1.2.3