Too complicated code for generating a random string?
jerro
a at a.com
Sat Feb 23 14:48:37 PST 2013
> Arguably, the goal is to actually replace "repeat+map". I view
> the fact that iota not being infinite as a drawback. And even
> if you do want a bound to the length of your range, I believe
> it should be the "top" step in your types, as opposed to the
> "bottom" step. Eg:
>
> iota(n).map!(_ => letters[uniform(0, $)]).array;
> vs
> repeat(0).map!(_ => letters[uniform(0, $)]).take(n).array;
>
> *Personally*, I prefer the logic behind the repeat+map+take,
> over iota+map's. It might actually even be faster. It is
> slightly more verbose though :/
There is a way to have an infinite generate range and also a
convenient way to initialize arrays - just add an overload of
array() that takes the length as the second parameter. Then we
can do:
auto randomString = generate!(() => letters[uniform(0,
$)]).array(10);
> ------
> Another advantage "generate" would have over repeat+map is if
> you want to pass an actual named impure function (as opposed to
> lambda):
>
> iota(0, n).map(_ => fun());
> or
> repeat(0).map(_ => fun()).take(n);
> vs
> fastGenerate!fun().take(n);
>
> Here, the generate would be much more "idiomatic", and also
> probably easier on the compile (function vs lamba: easier
> inlining, as you mention below).
In general, named functions and lambdas are pretty much
equivalent in regard to inlining (see http://goo.gl/XaOUP). In
your example, the last line could be more efficient than the
first two, because in the first two lines there could be one
extra function call in the worst case.
> Another thing I'd like to re-bring up (which I've partially
> implemented already), was bearophile's pass/tee suggestion:
> http://forum.dlang.org/thread/zkioveywsgxiovzvdypq@forum.dlang.org
I agree this is a good idea.
More information about the Digitalmars-d
mailing list