diff options
author | Stephen Dolan <mu@netsoc.tcd.ie> | 2012-12-28 15:04:16 +0000 |
---|---|---|
committer | Stephen Dolan <mu@netsoc.tcd.ie> | 2012-12-28 15:05:34 +0000 |
commit | 417899f9a02f8957e30fc6252cf0e02b713c4c4a (patch) | |
tree | d1a048a962ab10ca9c526cce4a6fab90ec2e27e0 /compile.c | |
parent | 9302b16247eb124c23cc7cf091822afc503105d3 (diff) |
Fold operation (code/docs/test)
Diffstat (limited to 'compile.c')
-rw-r--r-- | compile.c | 11 |
1 files changed, 11 insertions, 0 deletions
@@ -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); |