X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=lib%2FSub%2FNary.pm;h=c7792d5c3f782f1fd302526d0eab0c9aabf560a1;hb=ffe40b718c29e7f7a3ced4c719302736c573d710;hp=f408f8c50ff5fdd31d42ab622e401c8a8b4cf329;hpb=1a31caf5f555fb5f0b63ac682c7ea4b542282186;p=perl%2Fmodules%2FSub-Nary.git diff --git a/lib/Sub/Nary.pm b/lib/Sub/Nary.pm index f408f8c..c7792d5 100644 --- a/lib/Sub/Nary.pm +++ b/lib/Sub/Nary.pm @@ -42,7 +42,7 @@ This module uses the L framework to walk into subroutines and try to guess ho The usual constructor. Currently takes no argument. -=head2 C +=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 @@ -102,7 +102,7 @@ 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 * The C<'list'> state is absorbant in regard of all the other ones. +=item * The C state is absorbing in regard of all the other ones. This is just a pedantic way to say that "list + fixed length = list". That's why @@ -112,7 +112,8 @@ That's why } is considered as always returning an unbounded list. -The convolution law also 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 elements are involved : in the following example, sub oneorlist { if (rand < 0.1) { @@ -202,11 +203,16 @@ $ops{$_} = 0 for qw/stub nextstate/; $ops{$_} = 1 for qw/padsv/; $ops{$_} = 'list' for qw/padav/; $ops{$_} = 'list' for qw/padhv rv2hv/; -$ops{$_} = 'list' for qw/padany flip match/; +$ops{$_} = 'list' for qw/padany flip match entereval readline/; +$ops{stat} = 13; +$ops{caller} = sub { my @a = caller 0; scalar @a }->(); +$ops{localtime} = do { my @a = localtime; scalar @a }; +$ops{gmtime} = do { my @a = gmtime; scalar @a }; sub enter { my ($self, $cv) = @_; + return 'list' if class($cv) ne 'CV'; my $op = $cv->ROOT; my $tag = tag($op); @@ -278,7 +284,7 @@ sub expect_any { return ($self->expect_list($op))[0] => 1 if name($op) eq 'return'; - if (class($op) eq 'LOGOP') { + if (class($op) eq 'LOGOP' and not null $op->first) { my @res; my ($p, $r); @@ -304,7 +310,7 @@ sub expect_any { return $self->expect_list($op); } -# Stolen from Sub::Deparse +# Stolen from B::Deparse sub padval { $_[0]->{cv}->[0]->PADLIST->ARRAYelt(1)->ARRAYelt($_[1]) }