aboutsummaryrefslogtreecommitdiffstats
path: root/cppawk-include
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2022-04-14 19:55:29 -0700
committerKaz Kylheku <kaz@kylheku.com>2022-04-14 19:55:29 -0700
commit80e321e5615e72c3fed5a1986ef4b227d6d1f91f (patch)
tree96e6be71b56aebf8f88ad908c616e23c3fab4a04 /cppawk-include
parentbb571dec74a32a35c35af8a9306448f4894c4710 (diff)
downloadcppawk-80e321e5615e72c3fed5a1986ef4b227d6d1f91f.tar.gz
cppawk-80e321e5615e72c3fed5a1986ef4b227d6d1f91f.tar.bz2
cppawk-80e321e5615e72c3fed5a1986ef4b227d6d1f91f.zip
iter: take advantage of @let if available.
- All iterator definitions must provide a __temp_xxx macro now to declare temporary variables, even if empty. - Fixing str to use a temporary variable for the string length, and string object, so it's not evaluated multiple times. - Fixing argmax and argmin to use temporary variables whose names are derived from the argument symbols, so that clashes between multiple occurrences of these in one loop are prevented.
Diffstat (limited to 'cppawk-include')
-rw-r--r--cppawk-include/iter.h69
1 files changed, 54 insertions, 15 deletions
diff --git a/cppawk-include/iter.h b/cppawk-include/iter.h
index 7246f2c..8703fb1 100644
--- a/cppawk-include/iter.h
+++ b/cppawk-include/iter.h
@@ -48,12 +48,20 @@
#define dostring(index, chr, str) __dostring(index, chr, str)
#define dofields(index, val) __dofields(index, val)
-#define loop(...) for (__loop_init(__VA_ARGS__); \
+#define loop(...) __loop_temp(__VA_ARGS__) \
+ for (__loop_init(__VA_ARGS__); \
(__loop_test(__VA_ARGS__) || \
__loop_fini(__VA_ARGS__)) && \
__loop_prep(__VA_ARGS__); \
__loop_step(__VA_ARGS__))
+#if __have_let
+#define __loop_temp(...) __let(__varexpand(__temp_first, __temp_next, \
+ __VA_ARGS__))
+#else
+#define __loop_temp(...)
+#endif
+
#define __loop_init(...) __prog(__varexpand(__init_first, __init_next, \
__VA_ARGS__))
#define __loop_test(...) __nd(__varexpand(__test_first, __test_next, \
@@ -78,6 +86,9 @@
__step_ ## args)
#define __cross_next(prev, args) prev __cross_first(args)
+#define __temp_first(args) __temp_ ## args
+#define __temp_next(prev, args) prev __temp_ ## args
+
#define __init_first(args) __init_ ## args
#define __init_next(prev, args) prev, __init_ ## args
@@ -93,36 +104,44 @@
#define __step_first(args) __step_ ## args
#define __step_next(prev, args) prev, __step_ ## args
-#define __init_str(idx, ch, str) idx = 1
-#define __test_str(idx, ch, str) idx <= length(str)
-#define __prep_str(idx, ch, str) ch = substr(str, idx, 1)
+#define __str_s __g(ch)
+#define __str_len __g(idx)
+#define __temp_str(idx, ch, str) __str_s, __str_len,
+#define __init_str(idx, ch, str) __str_s = (str), __str_len = length(__str_s), idx = 1
+#define __test_str(idx, ch, str) idx <= __str_len
+#define __prep_str(idx, ch, str) ch = substr(__str_s, idx, 1)
#define __fini_str(idx, ch, str) 1
#define __step_str(idx, ch, str) idx++
+#define __temp_range(idx, from, to)
#define __init_range(idx, from, to) idx = (from)
#define __test_range(idx, from, to) idx <= (to)
#define __prep_range(idx, from, to) 1
#define __fini_range(idx, from, to) 1
#define __step_range(idx, from, to) idx++
+#define __temp_range_step(idx, from, to, step)
#define __init_range_step(idx, from, to, step) idx = (from)
#define __test_range_step(idx, from, to, step) idx <= (to)
#define __prep_range_step(idx, from, to, step) 1
#define __fini_range_step(idx, from, to, step) 1
#define __step_range_step(idx, from, to, step) idx += (step)
+#define __temp_from(idx, from)
#define __init_from(idx, from) idx = (from)
#define __test_from(idx, from) 1
#define __prep_from(idx, from) 1
#define __fini_from(idx, from) 1
#define __step_from(idx, from) idx++
+#define __temp_from_step(idx, from, step)
#define __init_from_step(idx, from, step) idx = (from)
#define __test_from_step(idx, from, step) 1
#define __prep_from_step(idx, from, step) 1
#define __fini_from_step(idx, from, step) 1
#define __step_from_step(idx, from, step) idx += (step)
+#define __temp_first_then(var, first, then)
#define __init_first_then(var, first, then) (var = (first))
#define __test_first_then(var, first, then) 1
#define __prep_first_then(var, first, then) 1
@@ -131,46 +150,54 @@
#define for_var(var, expr) first_then(var, expr, expr)
+#define __temp_list(iter, var, list)
#define __init_list(iter, var, list) iter = (list)
#define __test_list(iter, var, list) !__endp(iter)
#define __prep_list(iter, var, list) var = __car(iter)
#define __fini_list(iter, var, list) 0
#define __step_list(iter, var, list) iter = __cdr(iter)
+#define __temp___list(iter, var, list)
#define __init___list(iter, var, list) iter = (list)
#define __test___list(iter, var, list) !__endp(iter)
#define __prep___list(iter, var, list) var = __car(iter)
#define __fini___list(iter, var, list) 0
#define __step___list(iter, var, list) iter = __cdr(iter)
+#define __temp_fields(var) __g(var),
#define __init_fields(var) __g(var) = 1
#define __test_fields(var) __g(var) <= NF
#define __prep_fields(var) var = $ __g(var)
#define __fini_fields(var) 1
#define __step_fields(var) __g(var)++
+#define __temp_keys(key, array) __g(key),
#define __init_keys(key, array) __g(key) = __keys(array)
#define __test_keys(key, array) !__endp(__g(key))
#define __prep_keys(key, array) key = __car(__g(key))
#define __fini_keys(key, array) 1
#define __step_keys(key, array) __g(key) = __cdr(__g(key))
+#define __temp___keys(key, array) __g(key),
#define __init___keys(key, array) __g(key) = __keys(array)
#define __test___keys(key, array) !__endp(__g(key))
#define __prep___keys(key, array) key = __car(__g(key))
#define __fini___keys(key, array) 1
#define __step___keys(key, array) __g(key) = __cdr(__g(key))
+#define __temp_collect(var, expr)
#define __init_collect(var, expr) var = __list_begin()
#define __test_collect(var, expr) 1
#define __prep_collect(var, expr) var = __list_add(var, expr)
#define __fini_collect(var, expr) var = __list_end(var)
#define __step_collect(var, expr) 1
+#define __temp_collect_plus(var, expr)
#define __init_collect_plus(var, expr) var = __list_begin()
#define __test_collect_plus(var, expr) 1
#define __prep_collect_plus(var, expr) var = __list_add(var, expr)
#define __fini_collect_plus(var, expr) var = __list_end(__list_add(var, expr))
#define __step_collect_plus(var, expr) 1
+#define __temp_summing(var, expr)
#define __init_summing(var, expr) var = 0
#define __test_summing(var, expr) 1
#define __prep_summing(var, expr) var += (expr)
@@ -182,6 +209,7 @@ function __loop_max(a, b)
return a > b ? a : b
}
+#define __temp_maximizing(var, expr)
#define __init_maximizing(var, expr) var = nil
#define __test_maximizing(var, expr) 1
#define __prep_maximizing(var, expr) var = (__null(var) \
@@ -195,6 +223,7 @@ function __loop_min(a, b)
return a > b ? b : a
}
+#define __temp_minimizing(var, expr)
#define __init_minimizing(var, expr) var = nil
#define __test_minimizing(var, expr) 1
#define __prep_minimizing(var, expr) var = (__null(var) \
@@ -208,15 +237,20 @@ function __loop_argmax(a, arga, b, argb)
return a > b ? arga : argb;
}
-#define __init_argmax(amx, arg, expr) (__g(mx) = 0) || (amx = 0)
+#define __am_max __g(amx)
+#define __am_min __g(ami)
+#define __am_old __g(arg)
+
+#define __temp_argmax(amx, arg, expr) __am_max, __am_old,
+#define __init_argmax(amx, arg, expr) (__am_max = 0) || (amx = 0)
#define __test_argmax(amx, arg, expr) 1
-#define __prep_argmax(amx, arg, expr) ((__g(om) = __g(mx)) || 1) && \
- ((__g(mx) = \
- (__null(__g(mx)) \
+#define __prep_argmax(amx, arg, expr) ((__am_old = __am_max) || 1) && \
+ ((__am_max = \
+ (__null(__am_max) \
? expr \
- : __loop_max(__g(mx), \
+ : __loop_max(__am_max, \
expr))) || 1) && \
- ((__g(om) != __g(mx)) ? amx = arg : 1)
+ ((__am_old != __am_max) ? amx = arg : 1)
#define __fini_argmax(amx, arg, expr) 1
#define __step_argmax(amx, arg, expr) 1
@@ -225,30 +259,34 @@ function __loop_argmin(a, arga, b, argb)
return a < b ? arga : argb;
}
+#define __temp_argmin(ami, arg, expr) __am_min, __am_old,
#define __init_argmin(ami, arg, expr) (__g(mi) = 0) || (ami = 0)
#define __test_argmin(ami, arg, expr) 1
-#define __prep_argmin(ami, arg, expr) ((__g(om) = __g(mi)) || 1) && \
- ((__g(mi) = \
- (__null(__g(mi)) \
+#define __prep_argmin(ami, arg, expr) ((__am_old = __am_min) || 1) && \
+ ((__am_min = \
+ (__null(__am_min) \
? expr \
- : __loop_min(__g(mi), \
+ : __loop_min(__am_min, \
expr))) || 1) && \
- ((__g(om) != __g(mi)) ? ami = arg : 1)
+ ((__am_old != __am_min) ? ami = arg : 1)
#define __fini_argmin(ami, arg, expr) 1
#define __step_argmin(ami, arg, expr) 1
+#define __temp_while(expr)
#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 __temp_until(expr)
#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 __temp_lockstep(...)
#define __init_lockstep(...) __prog(__varexpand3(__init_first, __init_next, \
__VA_ARGS__))
#define __test_lockstep(...) __nd(__varexpand3(__test_first, __test_next, \
@@ -260,6 +298,7 @@ function __loop_argmin(a, arga, b, argb)
#define __step_lockstep(...) __prog(__varexpand3(__step_first, __step_next, \
__VA_ARGS__))
+#define __temp_if(test, clause)
#define __init_if(test, clause) __init_ ## clause
#define __test_if(test, clause) !(test) || __test_ ## clause
#define __prep_if(test, clause) (test) && __prep_ ## clause