Lost a new commercial user this week :(

ixid via Digitalmars-d digitalmars-d at puremagic.com
Sat Dec 27 04:53:51 PST 2014


On Saturday, 27 December 2014 at 11:42:45 UTC, Jacob Carlborg 
wrote:
> On 2014-12-27 09:32, Mike Parker wrote:
>
>> The proverbial straw that prompted my blog rant back then was 
>> to do with
>> std.string. I wanted to split a string on a specific 
>> character. So I
>> looked in the std.string docs for a split function. There 
>> wasn't one.
>> There's a 'splitLines' -- I don't recall if it existed then, 
>> but it
>> wouldn't have been what I was looking for anyway. So I 
>> searched the docs
>> and found std.array.split. I don't recall what the docs looked 
>> like
>> then, but now this is what we have.
>>
>> pure @safe S[] split(S)(S s) if (isSomeString!S);
>>
>> This above is grokkable -- it's fairly clear that S is a 
>> string and that
>> an array of strings is returned. Then we get these next two 
>> versions:
>>
>> auto split(R, E)(R r, E delim) if (isForwardRange!R &&
>> is(typeof(ElementType!R.init == E.init)));
>> auto split(alias isTerminator, R)(R r) if (isForwardRange!R &&
>> is(typeof(unaryFun!isTerminator(r.front))));
>>
>> Umm... all I want is to split a string on a specific 
>> character. What's
>> all this mess about ElementTypes and Rs and Es and unaryFuns 
>> and....
>>
>> The description, "Eagerly splits s into an array, using delim 
>> as the
>> delimiter." suggests this is what I'm looking for. I suppose I 
>> can just
>> pass it a string and a character and see what happens. But, 
>> that's just
>> trial and errro. The docs don't help me understand it. I don't 
>> like
>> using functions I don't understand. Heaven help me if I find a 
>> need for
>> std.array.join:
>>
>> ElementEncodingType!(ElementType!RoR)[] join(RoR, R)(RoR ror, 
>> R sep) if
>> (isInputRange!RoR && isInputRange!(Unqual!(ElementType!RoR)) &&
>> isInputRange!R && is(Unqual!(ElementType!(ElementType!RoR)) ==
>> Unqual!(ElementType!R)));
>> ElementEncodingType!(ElementType!RoR)[] join(RoR)(RoR ror) if
>> (isInputRange!RoR && isInputRange!(Unqual!(ElementType!RoR)));
>>
>> So the function to split a string on line breaks, which is
>> string-specific, is in std.string. The function to split a 
>> string on
>> whitespace, again string-specific, is in std.array. The 
>> function to
>> split any range on any element is in std.array. Which means I 
>> have to
>> think of strings not just as arrays, but as ranges, and have to
>> understand that some range functions are in std.range, others 
>> in
>> std.array and still others in std.algorithm. That means that I 
>> don't
>> always know where to look when I want to do something I've not 
>> done
>> before. Even if I do manage to find what I'm looking for, I 
>> then may
>> discover that it doesn't work because I want an array, but the 
>> function
>> returns a range and I need to convert it to an array, which 
>> means arrays
>> aren't really ranges like I thought and...
>
> There's also "split" vs "splitter" and "join" vs "joiner". This 
> doesn't make it easier.

Having array in std.array is also rather confusing for a newbie, 
it's an extra complication in their fight with lazy when they 
will be trying to use std.algorithm.



More information about the Digitalmars-d mailing list