diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2016-09-23 15:04:31 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2016-09-23 15:04:31 -0700 |
commit | 77b5a3eda0eda28b30addcfcd62cce1bae8542cf (patch) | |
tree | b7aa4a492896547909f042580171c1e503591ce5 /share | |
parent | 158f99b41bc0b75b6f571fc4f87f020ef80268ca (diff) | |
download | txr-77b5a3eda0eda28b30addcfcd62cce1bae8542cf.tar.gz txr-77b5a3eda0eda28b30addcfcd62cce1bae8542cf.tar.bz2 txr-77b5a3eda0eda28b30addcfcd62cce1bae8542cf.zip |
awk macro: support regexes better in ranges.
* share/txr/stdlib/awk.tl (sys:awk-compile-time): New slot,
rng-rec-temp. Specifies the name of a temporary variable
which is scoped over the evaluation of ranges, and which
caches a reference to the current record string.
(sys:range-test): New function.
(awk:let): Rename the original rng macrolet to sys:rng,
and introduce rng as a wrapper around it which inserts
the logic for calling the regex or function that might
emerge from the evaluation of from-expr or to-expr.
(awk): If ranges are present in the syntax, then bind
the temporary variable which caches the record around
the evaluations of the ranges.
* txr.1: Document new special behavior of rng w.r.t
functions and regexes. Add admonition against modifying
rec and some other awk variables from range expressions.
Diffstat (limited to 'share')
-rw-r--r-- | share/txr/stdlib/awk.tl | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/share/txr/stdlib/awk.tl b/share/txr/stdlib/awk.tl index 7c6ae504..07a5f3bc 100644 --- a/share/txr/stdlib/awk.tl +++ b/share/txr/stdlib/awk.tl @@ -48,6 +48,7 @@ begin-actions end-actions cond-actions (nranges 0) + (rng-rec-temp (gensym)) rng-expr-temps rng-exprs) @@ -109,6 +110,11 @@ (t (put-string self.rec) (put-string self.ors)))) +(defun sys:range-test (val rec) + (caseq (typeof val) + ((regex fun) (call val rec)) + (t val))) + (defun sys:awk-expander (clauses) (let ((awc (new sys:awk-compile-time))) (each ((cl clauses)) @@ -176,7 +182,7 @@ (macrolet ((next () '(return-from :awk-rec)) (next-file () '(return-from :awk-file)) (prn (. args) ^(qref ,',aws-sym (prn ,*args))) - (rng (from-expr to-expr :env e) + (sys:rng (from-expr to-expr :env e) (let ((ix (pinc (qref ,awc nranges))) (rng-temp (gensym)) (from-expr-ex (sys:expand from-expr e)) @@ -193,6 +199,9 @@ (or (set flag ,flag-new) ,flag-old))) (qref ,awc rng-exprs)) rng-temp)) + (rng (from-expr to-expr) + ^(sys:rng (sys:range-test ,from-expr ,(qref ,awc rng-rec-temp)) + (sys:range-test ,to-expr ,(qref ,awc rng-rec-temp)))) (ff (. opip-args) ^(symacrolet ((f (rslot ,',aws-sym 'fields 'f-to-rec))) (set f [(opip ,*opip-args) f]))) @@ -229,9 +238,10 @@ ,*awc.end-file-actions)))) (,awk-fun (lambda (,aws-sym) ,(if awc.rng-exprs - ^(let* ,(nreverse - (zip awc.rng-expr-temps - awc.rng-exprs)) + ^(let* ((,awc.rng-rec-temp rec) + ,*(nreverse + (zip awc.rng-expr-temps + awc.rng-exprs))) ,p-actions-xform) p-actions-xform)))) ,*awc.begin-actions |