diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2022-03-31 20:54:35 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2022-03-31 20:54:35 -0700 |
commit | 238b309af9310dc7508696df0513c1a5036aea49 (patch) | |
tree | f89157c10b2c5e6dfd85ccb1a68f976cd738b87a | |
parent | 40d1cc8671870ee13184d0fb5d96a6472886ad66 (diff) | |
download | cppawk-238b309af9310dc7508696df0513c1a5036aea49.tar.gz cppawk-238b309af9310dc7508696df0513c1a5036aea49.tar.bz2 cppawk-238b309af9310dc7508696df0513c1a5036aea49.zip |
loop: add summing, maximizing, while, until.
-rw-r--r-- | cppawk-include/iter.h | 31 | ||||
-rw-r--r-- | testcases-iter | 77 |
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 |