in reply to The Virtue of Laziness

Perl is a stack-based language: in the general case, the arguments to some function are put on the stack, and the function knows to consume them from there, and replace them with its return value. The job of map is to take a list of items and replace it with another list of items, and the way the implementation works means it can mostly reuse the space of the input list. Thus the optimization in for when iterating over a single explicit array is less relevant for map.

map {die} @array clearly isn't a very useful thing to do, do you have a more realistic example of something you'd like to do with a map that you feel could be made faster?

Wouldn't it be nice to have some kind of "explicit lazy dereferencing" in Perl?

If you want lazy evaluation in general, I think it's unlikely you'll ever get that in Perl. If you just want something specifically for mapping over a literal array, that's almost certainly doable - but it would add complexity to the perl core as well as to the language people have to learn, so the benefits would have to justify those costs.

LanX wrote: I'm sceptical [p5p] have resource left for that.

There is no pool of resources to be assigned, rather there is a loose collection of individuals working on things they find interesting enough to spend their time on. So having a use case that someone finds compelling is the starting point.

Replies are listed 'Best First'.
Re^2: The Virtue of Laziness
by jo37 (Curate) on May 05, 2024 at 14:55 UTC
    ...do you have a more realistic example of something you'd like to do with a map that you feel could be made faster?

    As LanX already proposed, it is the set of functions in List::Util et al. doing short circuit that could benefit from such optimization.

    I didn't want to bring modules into the game when I can describe the behaviour without such.

    Greetings,
    🐻

    $gryYup$d0ylprbpriprrYpkJl2xyl~rzg??P~5lp2hyl0p$
Re^2: The Virtue of Laziness
by LanX (Saint) on May 05, 2024 at 15:07 UTC
    > If you want lazy evaluation in general, I think it's unlikely you'll ever get that in Perl.

    Not sure what is meant with "in general"

    Changing all map and grep to lazy would most certainly cause problems with old code which relies on the time the elements of the list are evaluated.

    One would need new commands like lmap (lazy) or igrep (iterator) to implement this.

    I did a POC once with iterators, problem was the performance of those iterators after the third loop level was abysmal.

    And there are dragons concerning evaluation timing.

    Not sure if the model in Haskell or Python should be considered canonic.

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    see Wikisyntax for the Monastery

Re^2: The Virtue of Laziness
by LanX (Saint) on May 05, 2024 at 14:33 UTC
    > do you have a more realistic example of something you'd like to do with a map that you feel could be made faster?

    Well first {} LIST from List::Util , is a specialized grep which stops processing after success.

    And not needing to preallocate a huge list with 1e6 entries would be faster.

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    see Wikisyntax for the Monastery

Re^2: The Virtue of Laziness
by jo37 (Curate) on May 12, 2024 at 21:51 UTC