summaryrefslogtreecommitdiffstats
path: root/match.c
diff options
context:
space:
mode:
Diffstat (limited to 'match.c')
-rw-r--r--match.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/match.c b/match.c
index 4e060df0..7556494f 100644
--- a/match.c
+++ b/match.c
@@ -1503,9 +1503,14 @@ static val extract_bindings(val bindings, val output_spec)
list_collect_decl (bindings_out, ptail);
val var_list = extract_vars(output_spec);
- for (; bindings; bindings = cdr(bindings))
- if (memq(car(car(bindings)), var_list))
- list_collect(ptail, car(bindings));
+ for (; bindings; bindings = cdr(bindings)) {
+ val binding = car(bindings);
+ val sym = car(binding);
+ if (assoc(sym, bindings_out))
+ continue;
+ if (memq(sym, var_list))
+ list_collect(ptail, binding);
+ }
return bindings_out;
}
@@ -1541,15 +1546,15 @@ static void do_output_line(val bindings, val specline, val filter, val out)
nao));
if (equal(max_depth, zero) && empty_clauses) {
- do_output_line(bindings, empty_clauses, filter, out);
+ do_output_line(nappend2(bind_cp, bindings), empty_clauses, filter, out);
} else if (equal(max_depth, one) && single_clauses) {
- val bind_a = mapcar(func_n1(bind_car), bind_cp);
+ val bind_a = nappend2(mapcar(func_n1(bind_car), bind_cp), bindings);
do_output_line(bind_a, single_clauses, filter, out);
} else if (!zerop(max_depth)) {
cnum i;
for (i = 0; i < c_num(max_depth); i++) {
- val bind_a = mapcar(func_n1(bind_car), bind_cp);
+ val bind_a = nappend2(mapcar(func_n1(bind_car), bind_cp), bindings);
val bind_d = mapcar(func_n1(bind_cdr), bind_cp);
if (i == 0 && first_clauses) {
@@ -1608,15 +1613,15 @@ static void do_output(val bindings, val specs, val filter, val out)
nao));
if (equal(max_depth, zero) && empty_clauses) {
- do_output(bind_cp, empty_clauses, filter, out);
+ do_output(nappend2(bind_cp, bindings), empty_clauses, filter, out);
} else if (equal(max_depth, one) && single_clauses) {
- val bind_a = mapcar(func_n1(bind_car), bind_cp);
+ val bind_a = nappend2(mapcar(func_n1(bind_car), bind_cp), bindings);
do_output(bind_a, single_clauses, filter, out);
} else if (!zerop(max_depth)) {
cnum i;
for (i = 0; i < c_num(max_depth); i++) {
- val bind_a = mapcar(func_n1(bind_car), bind_cp);
+ val bind_a = nappend2(mapcar(func_n1(bind_car), bind_cp), bindings);
val bind_d = mapcar(func_n1(bind_cdr), bind_cp);
if (i == 0 && first_clauses) {