diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2012-02-26 20:58:31 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2012-02-26 20:58:31 -0800 |
commit | 73625e0ae9b4fde9c6ff64bd6dc22a1b7797be1a (patch) | |
tree | 44308c28567baad646762322f84bb501262ada66 /match.c | |
parent | 7649d799041454321809da89a5716afc19c34f3d (diff) | |
download | txr-73625e0ae9b4fde9c6ff64bd6dc22a1b7797be1a.tar.gz txr-73625e0ae9b4fde9c6ff64bd6dc22a1b7797be1a.tar.bz2 txr-73625e0ae9b4fde9c6ff64bd6dc22a1b7797be1a.zip |
Fixing long-time (pre-GIT) bug. The object (nil) was stupidly used to
represent empty optional output clauses, distinguishing them from
missing clauses. This creates an ambiguity, so that an @(output)
block which puts out a single empty line is treated as empty.
Present but empty clauses are now represented by t.
* match.c (do_output_line): Check for t and bail.
(do_output): Check for t instead of (nil) and bail.
* parser.y (o_elems_opt2): Nonterminal deleted.
(out_clauses_opt): Empty case generates nil.
(req_parts_opt): o_elems_opt2 replaced by o_elems_opt.
(repeat_rep_helper): Function now keeps track of which
clauses were specified. For those that were specified, but
empty, it substitutes t.
* tests/008/empty-clauses.expected: New file.
* tests/008/empty-clauses.txr: New file.
Diffstat (limited to 'match.c')
-rw-r--r-- | match.c | 5 |
1 files changed, 4 insertions, 1 deletions
@@ -1559,6 +1559,9 @@ static val extract_bindings(val bindings, val output_spec) static void do_output_line(val bindings, val specline, val filter, val out) { + if (specline == t) + return; + for (; specline; specline = rest(specline)) { val elem = first(specline); @@ -1689,7 +1692,7 @@ static void do_output_line(val bindings, val specline, val filter, val out) static void do_output(val bindings, val specs, val filter, val out) { - if (equal(specs, null_list)) + if (specs == t) return; for (; specs; specs = cdr(specs)) { |