Another rambling musing by a Dynamic Programmer - map!
Ary Borenszweig via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Tue Jun 24 13:42:43 PDT 2014
On 6/24/14, 4:13 PM, Jacob Carlborg wrote:
> On 2014-06-24 04:34, John Carter wrote:
>> So in Ruby and R and Scheme and... I have happily used map / collect for
>> years and years.
>>
>> Lovely thing.
>>
>> So I did the dumb obvious of
>>
>> string[] stringList = map!...;
>>
>> And D barfed, wrong type, some evil voldemort thing again.
>>
>> So..
>>
>> auto stringList = map!....;
>>
>> and we're good..
>>
>> and happily use it as
>> foreach( s; stringList)....
>>
>> Suddenly the words in the map! documentation made sense to me... unlike
>> Ruby, map doesn't allocate and populate an array. It just returns a lazy
>> range.
>>
>> No array is allocated (unless I ask for one), it just does the lambda
>> when I want it in the foreach!
>>
>> Cool! Very very cunning. Very light on resources.
>
> I wished Ruby behaved that way quite often, especially when chaning
> multiple functions. In Ruby 2.0 there are lazy "map" and similar
> functions but I've heard they are slower than the eager ones.
My guess is that it's slower because it's implemented using fibers, so
you loose a lot of time creating the fiber and switching contexts. But
in this way any Enumerable can be turned into a lazy one.
I think they could optimize it for arrays by, for example, making a
specific Enumerator without the need to use fibers.
In fact, I tried this in Crystal and I got performance similar to that
of D. So you get the best of both worlds: you can either choose to
always return an array, or to lazily apply transformations to it. I find
returning an array to be more intuitive and easier to reason about.
More information about the Digitalmars-d-learn
mailing list