diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2017-06-07 23:51:10 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2017-06-07 23:51:10 -0700 |
commit | 3420284a02f816d3e5208ea1489c7b6afed6539a (patch) | |
tree | 8d73fdc393f8a3b6737863745d2899665c1c228c /share | |
parent | de885069bebb4e674b7579b22dbecab0742ba02b (diff) | |
download | txr-3420284a02f816d3e5208ea1489c7b6afed6539a.tar.gz txr-3420284a02f816d3e5208ea1489c7b6afed6539a.tar.bz2 txr-3420284a02f816d3e5208ea1489c7b6afed6539a.zip |
awk macro: fix broken rng.
Bug: rng fails to activate when the to and from condition
are true for the same record.
* share/txr/stdlib/awk.tl (sys:awk-mac-let): Rename the flag-new
gensym holder to flag-act, since it indicates whether the range
is active, either from before or due to being activated by
the current record. A new gensym is added to indicate whether
the range is being deactivated in this record. The inclusive
rng range refers to this variable rather than flag-old.
But a bug emulation is provided to refer to the wrong variable.
* txr.1: Added compatibility note.
Diffstat (limited to 'share')
-rw-r--r-- | share/txr/stdlib/awk.tl | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/share/txr/stdlib/awk.tl b/share/txr/stdlib/awk.tl index b0f54aaf..7c4033e6 100644 --- a/share/txr/stdlib/awk.tl +++ b/share/txr/stdlib/awk.tl @@ -302,7 +302,8 @@ (from-expr-ex (sys:expand from-expr e)) (to-expr-ex (sys:expand to-expr e)) (flag-old (gensym)) - (flag-new (gensym))) + (flag-act (gensym)) + (flag-deact (gensym))) (tree-bind ((from-expr-ex fe-fv fe-ff fe-ev fe-ef) (to-expr-ex te-fv te-ff te-ev te-ef) (from-expr-orig to-expr-orig)) @@ -330,16 +331,21 @@ 'functions) (push rng-temp (qref ,awc rng-expr-temps)) (push ^(placelet ((flag (vecref (qref ,',aws-sym rng-vec) ,ix))) - (let* ((,flag-old flag) ,flag-new) + (let ((,flag-old flag) ,flag-act ,flag-deact) (when (or ,flag-old ,from-expr-ex) - (set ,flag-new t)) - (when (and ,flag-new ,to-expr-ex) - (set ,flag-new nil)) + (set ,flag-act t)) + (when (and ,flag-act ,to-expr-ex) + (set ,flag-act nil) + (set ,flag-deact t)) ,*(caseq style - (rng ^((or (set flag ,flag-new) ,flag-old))) - (-rng- ^((and (set flag ,flag-new) ,flag-old))) - (rng- ^((set flag ,flag-new))) - (-rng ^((set flag ,flag-new) ,flag-old))))) + (rng ^((or (set flag ,flag-act) + ,(if (and (plusp sys:compat) + (<= sys:compat 177)) + flag-old + flag-deact)))) + (-rng- ^((and (set flag ,flag-act) ,flag-old))) + (rng- ^((set flag ,flag-act))) + (-rng ^((set flag ,flag-act) ,flag-old))))) (qref ,awc rng-exprs)) rng-temp))) (rng (:form form from-expr to-expr) |