in reply to How to understand chapter 6 of Higher Order Perl?

So I was thinking about what BrowserUK said. "Misguided attempts to gloss over moderately 'difficult' Perl syntax..." It appears to me he's absolutely right. So I went ahead and rewrote some of the examples from the book.
sub upto_list { my $from = shift; state $upto = shift; return undef if $from > $upto; return { head => $from, tail => sub { upto_list( $from + 1 ); }, }; } sub show { my $node = shift; my $i = shift // 10; while ($node->{head} && $i-- > 0) { say $node->{head}; $node = $node->{tail}->(); } } show( upto_list( 10, 15 ) );
I personally think that that is much easier to understand than the Lisp-like version from the book... It even works faster. What's the point in making Perl look like Lisp anyway? So! I'll answer my own question. 'Anonimous Monk, just rewrite the whole damn chapter in Perl'. Thanks everyone! Especially BrowserUK.

Replies are listed 'Best First'.
Re^2: How to understand chapter 6 of Higher Order Perl?
by BrowserUk (Patriarch) on Mar 13, 2014 at 22:07 UTC

    Why did you use state there?

    The problem is, it means that you cannot construct two concurrent iterators that work correctly.

    With the line commented out in the following:

    #my $_10_15 = upto_list( 10, 15 ); my $_5_30 = upto_list( 5, 30 ); show( $_5_30, 20 );

    the show() line produces the expected 20 values:

    C:\test>1078236.pl 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

    But uncomment the 10/15 constructor and the show() now only produces 11 values despite requesting 20:

    C:\test>1078236.pl 5 6 7 8 9 10 11 12 13 14 15

    With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.