summaryrefslogtreecommitdiffstats
path: root/compile.c
diff options
context:
space:
mode:
authorStephen Dolan <mu@netsoc.tcd.ie>2012-12-28 15:04:16 +0000
committerStephen Dolan <mu@netsoc.tcd.ie>2012-12-28 15:05:34 +0000
commit417899f9a02f8957e30fc6252cf0e02b713c4c4a (patch)
treed1a048a962ab10ca9c526cce4a6fab90ec2e27e0 /compile.c
parent9302b16247eb124c23cc7cf091822afc503105d3 (diff)
Fold operation (code/docs/test)
Diffstat (limited to 'compile.c')
-rw-r--r--compile.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/compile.c b/compile.c
index 139b64bc..178b0463 100644
--- a/compile.c
+++ b/compile.c
@@ -306,6 +306,17 @@ block gen_collect(block expr) {
gen_op_var_bound(LOADV, array_var));
}
+block gen_fold(const char* varname, block init, block fold) {
+ block loop = BLOCK(fold, gen_op_var_unbound(STOREV, varname), gen_op_simple(BACKTRACK));
+ return BLOCK(gen_op_simple(DUP),
+ init,
+ block_bind(gen_op_var_unbound(STOREV, varname),
+ BLOCK(gen_op_target(FORK, loop),
+ loop,
+ gen_op_var_unbound(LOADV, varname)),
+ OP_HAS_VARIABLE));
+}
+
block gen_assign(block expr) {
block result_var = block_bind(gen_op_var_unbound(STOREV, "result"),
gen_noop(), OP_HAS_VARIABLE);