X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=lib%2FSub%2FNary.pm;h=159dd8e6bc9a31fb753478eec7c573feb852bad1;hb=3a7f23b3ef06db23f3bd2f2707e70b61c6a15b4f;hp=73345b506a4ccfc870ab848ce6b527bf8cf74028;hpb=abc14695a4ce4fd4733c9185d87b774ee7c1a220;p=perl%2Fmodules%2FSub-Nary.git diff --git a/lib/Sub/Nary.pm b/lib/Sub/Nary.pm index 73345b5..159dd8e 100644 --- a/lib/Sub/Nary.pm +++ b/lib/Sub/Nary.pm @@ -73,7 +73,9 @@ The probability is computed as such : =over 4 -=item * When branching, each branch is considered equally possible. +=item * + +When branching, each branch is considered equally possible. For example, the subroutine @@ -99,7 +101,9 @@ As for it is considered to return C<3> scalars with probability C<1/2>, C<2> with probability C<1/2 * 1/2 = 1/4> and C<1> (when the two tests fail, the last computed value is returned, which here is C<< $x > 0.9 >> evaluated in the scalar context of the test) with remaining probability C<1/4>. -=item * The total probability law for a given returning point is the convolution product of the probabilities of its list elements. +=item * + +The total probability law for a given returning point is the convolution product of the probabilities of its list elements. As such, @@ -115,11 +119,15 @@ returns C<3> or C<4> arguments with probability C<1/2> ; and never returns C<1> argument but returns C<2> with probability C<1/2 * 1/2 = 1/4>, C<3> with probability C<1/2 * 1/2 + 1/2 * 1/2 = 1/2> and C<4> with probability C<1/4> too. -=item * If a core function may return different numbers of scalars, each kind is considered equally possible. +=item * + +If a core function may return different numbers of scalars, each kind is considered equally possible. For example, C returns C<13> elements on success and C<0> on error. The according probability will then be C<< { 0 => 0.5, 13 => 0.5 } >>. -=item * The C and C states are absorbing in regard of all the other ones. +=item * + +The C and C states are absorbing in regard of all the other ones. This is just a pedantic way to say that C, C, but note also that C. That's why @@ -418,6 +426,20 @@ sub pp_exit { return $r, undef; } +sub pp_die { + my ($self, $op) = @_; + + my ($r, undef) = $self->inspect_kids($op); + if (defined $r) { + my $c = 1 - count $r; + $r->{die} = $c if $c; + } else { + $r = { die => 1 }; + } + + return $r, undef; +} + sub pp_goto { my ($self, $op) = @_; @@ -495,6 +517,18 @@ sub pp_aassign { $self->inspect($op); } +sub pp_leavetry { + my ($self, $op) = @_; + + my ($r, $l) = $self->inspect_kids($op); + if (defined $r) { + my $d = delete $r->{die}; + $r->{0} += $d if defined $d; + } + + return $r, $l; +} + sub pp_leaveloop { my ($self, $op) = @_;