summaryrefslogtreecommitdiffstats
path: root/share/txr
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2016-09-23 15:04:31 -0700
committerKaz Kylheku <kaz@kylheku.com>2016-09-23 15:04:31 -0700
commit77b5a3eda0eda28b30addcfcd62cce1bae8542cf (patch)
treeb7aa4a492896547909f042580171c1e503591ce5 /share/txr
parent158f99b41bc0b75b6f571fc4f87f020ef80268ca (diff)
downloadtxr-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/txr')
-rw-r--r--share/txr/stdlib/awk.tl18
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