Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Implement multi-variable for
  • Loading branch information
sorear committed May 26, 2011
1 parent dd9d259 commit ca9fc3e
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 2 deletions.
2 changes: 0 additions & 2 deletions TODO
Expand Up @@ -37,8 +37,6 @@ MEDIUM

+ &hyperunary

+ for-loops with multiple parameters

Implement your favorite ?-vars.

Finish the set of Num operators, includig number-theoretic and
Expand Down
34 changes: 34 additions & 0 deletions src/niecza
Expand Up @@ -28,6 +28,40 @@ use OptRxSimple;
use STD;
use Sig;

augment class Op::ForLoop { #OK exist
method statement_level() {
my $var = [ map { ::GLOBAL::NieczaActions.gensym },
0 ..^ +$.sink.body.signature.params ];
$.sink.once = True;
::Op::ImmedForLoop.new(source => $.source, var => $var,
sink => ::Op::CallSub.new(invocant => $.sink,
positionals => [ map { ::Op::LetVar.new(name => $_) }, @$var]));
}
}

augment class Op::ImmedForLoop { #OK exist
method code_labelled($body, $l) {
my $id = ::GLOBAL::NieczaActions.genid;

CgOp.rnull(CgOp.letn(
"!iter$id", CgOp.vvarlist_new_empty,
(map { $_, CgOp.null('var') }, @$.var),
CgOp.vvarlist_push(CgOp.letvar("!iter$id"),
$.source.cgop($body)),
CgOp.whileloop(0, 0,
CgOp.iter_hasflat(CgOp.letvar("!iter$id")),
CgOp.prog(
(map { CgOp.letvar($_,
CgOp.vvarlist_shift(CgOp.letvar("!iter$id")))},@$.var),
CgOp.sink(CgOp.xspan("redo$id", "next$id", 0,
$.sink.cgop($body),
1, $l, "next$id",
2, $l, "last$id",
3, $l, "redo$id")))),
CgOp.label("last$id")));
}
}

augment class CgOp {
}

Expand Down
4 changes: 4 additions & 0 deletions test2.pl
Expand Up @@ -13,6 +13,10 @@
is +[ Foo.new(bar => (1,2,4)).bar ], 3, '@.bar initializes with list context';
is +[ Foo.new(bar => 5).bar ], 1, '@.bar can initialize from a single item';
is +[ Foo.new.quux ], 3, '@.quux with init list works';

my $str = '';
for 1,2,3,4 -> $x, $y { $str ~= "$x|$y," }
is $str, "1|2,3|4,", 'multivariable for works';
}

#is $?FILE, 'test.pl', '$?FILE works';
Expand Down

0 comments on commit ca9fc3e

Please sign in to comment.