aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cppawk-include/iter.h31
-rw-r--r--testcases-iter77
2 files changed, 108 insertions, 0 deletions
diff --git a/cppawk-include/iter.h b/cppawk-include/iter.h
index 8b6a3ce..4abbdce 100644
--- a/cppawk-include/iter.h
+++ b/cppawk-include/iter.h
@@ -153,6 +153,37 @@
#define __fini_collect(var, expr) var = list_end(var)
#define __step_collect(var, expr) 1
+#define __init_summing(var, expr) var = 0
+#define __test_summing(var, expr) 1
+#define __prep_summing(var, expr) var += (expr)
+#define __fini_summing(var, expr) 1
+#define __step_summing(var, expr) 1
+
+function __loop_max(a, b)
+{
+ return a > b ? a : b
+}
+
+#define __init_maximizing(var, expr) var = nil
+#define __test_maximizing(var, expr) 1
+#define __prep_maximizing(var, expr) var = (null(var) \
+ ? expr \
+ : __loop_max(var, expr))
+#define __fini_maximizing(var, expr) 1
+#define __step_maximizing(var, expr) 1
+
+#define __init_while(expr) 1
+#define __test_while(expr) expr
+#define __prep_while(expr) 1
+#define __fini_while(expr) 1
+#define __step_while(expr) 1
+
+#define __init_until(expr) 1
+#define __test_until(expr) !(expr)
+#define __prep_until(expr) 1
+#define __fini_until(expr) 1
+#define __step_until(expr) 1
+
#define __init_lockstep(...) prog(__varexpand3(__init_first, __init_next, \
__VA_ARGS__))
#define __test_lockstep(...) __and(__varexpand3(__test_first, __test_next, \
diff --git a/testcases-iter b/testcases-iter
index 59f9548..ef2a9b0 100644
--- a/testcases-iter
+++ b/testcases-iter
@@ -224,3 +224,80 @@ c K Y 1 100
c K Y 2 101
c K Y 3 102
(1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3)
+--
+11:
+
+$cppawk '
+#include <iter.h>
+
+BEGIN {
+ loop (range(i, 1, 10),
+ summing(s, i))
+ {
+ print s
+ }
+ print "sum =", s
+}'
+:
+1
+3
+6
+10
+15
+21
+28
+36
+45
+55
+sum = 55
+--
+12:
+
+$cppawk '
+#include <iter.h>
+
+BEGIN {
+ loop (from_step (vel, 5, -1),
+ from_step (pos, 0, vel),
+ while (pos >= 0),
+ maximizing (maxpos, pos))
+ {
+ print pos
+ }
+ print "maxpos =", maxpos
+}'
+:
+0
+4
+7
+9
+10
+10
+9
+7
+4
+0
+maxpos = 10
+--
+13:
+
+$cppawk '
+#include <iter.h>
+
+BEGIN {
+ loop (from_step (vel, 5, -1),
+ from_step (pos, 0, vel),
+ until (vel <= 0),
+ maximizing (maxpos, pos))
+ {
+ print pos
+ }
+ print "maxpos =", maxpos
+}'
+:
+0
+4
+7
+9
+10
+maxpos = 10