X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=lib%2FSub%2FNary.pm;h=73345b506a4ccfc870ab848ce6b527bf8cf74028;hb=abc14695a4ce4fd4733c9185d87b774ee7c1a220;hp=1406d6695dbde7f89ce4e62c52177c039a34cef4;hpb=9e42e470d0042056765361fbcbf828492ee58d9c;p=perl%2Fmodules%2FSub-Nary.git diff --git a/lib/Sub/Nary.pm b/lib/Sub/Nary.pm index 1406d66..73345b5 100644 --- a/lib/Sub/Nary.pm +++ b/lib/Sub/Nary.pm @@ -43,9 +43,23 @@ The usual constructor. Currently takes no argument. =head2 C -Takes a code reference to a named or anonymous subroutine, and returns a hash reference whose keys are the possible numbers of returning scalars, and the corresponding values the "probability" to get them. The special key C<'list'> is used to denote a possibly infinite number of returned arguments. The return value hence would look at +Takes a code reference to a named or anonymous subroutine, and returns a hash reference whose keys are the possible numbers of returning scalars, and the corresponding values the "probability" to get them. A few special keys are also used : - { 1 => 0.2, 2 => 0.4, 4 => 0.3, list => 0.1 } +=over 4 + +=item * + +C<'list'> is used to denote a possibly infinite number of returned arguments ; + +=item * + +C<'exit'> gives the probability for C to be called somewhere in the code. + +=back + +The return value hence would look at + + { 1 => 0.2, 2 => 0.4, 4 => 0.25, list => 0.1, exit => 0.05 } that is, we should get C<1> scalar C<1> time over C<5> and so on. The sum of all values is C<1>. The returned result, and all the results obtained from intermediate subs, are cached into the object. @@ -105,9 +119,9 @@ never returns C<1> argument but returns C<2> with probability C<1/2 * 1/2 = 1/4> 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 state is 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 "list + fixed length = list". +This is just a pedantic way to say that C, C, but note also that C. That's why sub listy { @@ -116,7 +130,7 @@ That's why is considered as always returning an unbounded list. -Also, the convolution law does not behave the same when C elements are involved : in the following example, +Also, the convolution law does not behave the same when C or C elements are involved : in the following example, sub oneorlist { if (rand < 0.1) { @@ -389,6 +403,21 @@ sub pp_anoncode { return $self->{sub} ? $self->enter($self->const_sv($op)) : (undef, 1) } +sub pp_exit { + my ($self, $op) = @_; + + my $r; + if ($op->flags & OPf_KIDS) { + ($r, my $l) = $self->inspect($op->first); + return $r, $l if defined $r and zero $l; + $r->{exit} = 1 - count $r; + } else { + $r = { 'exit' => 1 }; + } + + return $r, undef; +} + sub pp_goto { my ($self, $op) = @_;