[Issue 9550] Repeat!fun(size_t n)

d-bugmail at puremagic.com d-bugmail at puremagic.com
Wed Feb 20 01:15:33 PST 2013


http://d.puremagic.com/issues/show_bug.cgi?id=9550



--- Comment #3 from monarchdodra at gmail.com 2013-02-20 01:15:30 PST ---
(In reply to comment #2)
> (In reply to comment #1)
> > Isn't what you are asking for a special case of sequence that discards any and
> > all input?
> > 
> > //----
> > int fun(T)(T/+Tuple!()+/, uint n)
> > {
> >     static int i;
> >     return ++++i;
> > }
> > 
> > void main()
> > {
> >     auto a = sequence!fun();
> >     writeln(a.take(10));
> > }
> > //----
> > [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
> > //----
> > 
> > In this case "T" is a tuple containing the empty state, and n is the iteration
> > count.
> > 
> > Apart from the fancy sig, it's what you are asking for.
> > 
> > Given that the signature of "fun" isn't specified yet, we could special case
> > sequence for sequences that have no initial state, to simply call fun(n) (as
> > well as be more efficient). 
> > 
> > I think it would be a good idea. So I'll look into doing that. PS: could you
> > link the mentioned discussion, it could help.
> 
> Granted, that is what I'm asking for, but it seems as hackish (if not more
> confusing) then the iota solution.
> 
> The sequence solution does not sound very intuitive given the fact the output
> would change on each retrieval/take from the range.
> 
> The discussions have been over a many conversations, as I have run into this
> problem several times now, and finally resolved it isn't just something I have
> missed in phobos.

FYI, sequence caches it's result, so if you just call front twice in a row, you
*won't* get different values for each front. map *doesn't* cache its result, so
you *will* get different results if you call front twice in a row.

As for intuitiveness, I personally prefer "sequence" over "map", but that may
be because I actually use sequence and recurrence, so I'm more used to it.

A third alternative you could use is, instead of iota, you may want to consider
using repeat:

//----
int fun(int)
{
    static int i;
    return ++++i;
}

void main()
{
    auto a = repeat(0).map!fun();
    writeln(a.take(10));
}
//----

The "advantage" this approach is that you define the range *mechanics*
(repeat+map) first, and then build the bounds on top of that (take).

Since take is infinite, there are chances it'll run faster too (operations such
as length/empty will be easier to compute, since carried by the "top", as
opposed to the "bottom").


//--------
But enough off-topic. You opened an enhancement request. Could you maybe
formalize your need a bit more, tell us in more detail what the semantics of
the range you are trying to build are? How you would use such a range? This
would help us better address the issue.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list