if (null $op) {
# If the logop has no else branch, it can also return the *scalar* result of
# the conditional
- $l3 = { 1 => $c };
+ $l3 = { 1 => 1 };
} else {
($r3, $l3) = $self->inspect($op);
}
}
$op = $op->sibling;
- my $r = (name($op->first) eq 'and') ? ($self->inspect($op->first->first->sibling))[0]
- : ($self->inspect($op))[0];
+ my $r;
+ if (name($op->first) eq 'and') {
+ ($r, my $l) = ($self->inspect($op->first->first))[0];
+ return $r, $l if $r and zero $l;
+ $r = ($self->inspect($op->first->first->sibling))[0];
+ } else {
+ $r = ($self->inspect($op))[0];
+ }
+
my $c = 1 - count $r;
- diag "& leaveloop" if $DEBUG;
+ diag "& leaveloop $c" if $DEBUG;
return $r, $c ? { 0 => $c } : undef;
}
}
my $c = 1 - count $r;
- return $r, ($l && $c) ? { 'list' => $c } : undef
+ return $r, $c ? { 'list' => $c } : undef
}
sub pp_grepwhile {
my ($r2, $l2) = $self->inspect($op->sibling);
return $r2, $l2 if $r2 and zero $l2;
- diag Dumper [ $r2, $l2 ] if $DEBUG;
- my $c = count $l2; # First one to happen
+ my $c2 = count $l2; # First one to happen
my ($r1, $l1) = $self->inspect($op);
- diag Dumper [ $r1, $l1 ] if $DEBUG;
- return (add $r2, scale $c, $r1), undef if $r1 and zero $l1 and not zero $l2;
- return { 'list' => 1 }, undef if list $l2;
+ return (add $r2, scale $c2, $r1), undef if $r1 and zero $l1 and not zero $l2;
+ diag Dumper [ [ $r1, $l1 ], [ $r2, $l2 ] ] if $DEBUG;
+ my $c1 = count $l1;
$l2 = { $l2 => 1 } unless ref $l2;
- my $r = add $r2, scale $c,
- normalize
- add map { power $r1, $_, $l2->{$_} } keys %$l2;
- $c = 1 - count $r;
+ my $r = add $r2,
+ scale $c2,
+ add map { scale $l2->{$_}, cumulate $r1, $_, $c1 } keys %$l2;
+ my $c = 1 - count $r;
return $r, $c ? { ((zero $l2) ? 0 : 'list') => $c } : undef;
}
my ($r2, $l2) = $self->inspect($op->sibling);
return $r2, $l2 if $r2 and zero $l2;
- my $c = count $l2; # First one to happen
+ my $c2 = count $l2; # First one to happen
my ($r1, $l1) = $self->inspect($op);
- return (add $r2, scale $c, $r1), undef if $r1 and zero $l1 and not zero $l2;
+ return (add $r2, scale $c2, $r1), undef if $r1 and zero $l1 and not zero $l2;
diag Dumper [ [ $r1, $l1 ], [ $r2, $l2 ] ] if $DEBUG;
+ my $c1 = count $l1;
$l2 = { $l2 => 1 } unless ref $l2;
- my $r = add $r2, scale $c,
- normalize
- add map { power $r1, $_, $l2->{$_} } keys %$l2;
- $c = 1 - count $r;
+ my $r = add $r2,
+ scale $c2,
+ add map { scale $l2->{$_}, cumulate $r1, $_, $c1 } keys %$l2;
+ my $c = 1 - count $r;
my $l = scale $c, normalize add map { power $l1, $_, $l2->{$_} } keys %$l2;
return $r, $l;
}