A better way to write this function? (style question)

Brad Anderson eco at gnuk.net
Mon Dec 30 14:38:42 PST 2013


On Monday, 30 December 2013 at 22:30:02 UTC, John Colvin wrote:
> On Monday, 30 December 2013 at 22:17:21 UTC, John Colvin wrote:
>> On Monday, 30 December 2013 at 21:40:58 UTC, Thomas Gann wrote:
>>> I've written a Markov bot in D, and I have function whose job 
>>> it is to take an input string, convert all newline characters 
>>> to spaces and all uppercase letters to lowercase, and then 
>>> return an array of words that are generated by splitting the 
>>> string up by whitespace. Here is the function is question:
>>>
>>> string[] split_sentence(string input)
>>> {
>>>   string line;
>>>
>>>   foreach(c; input)
>>>   {
>>>       if(c == '\n' || c == '\r')
>>>           line ~= ' ';
>>>
>>>       else
>>>           line ~= c.toLower();
>>>   }
>>>
>>>   return line.splitter(' ').filter!(a => a.length).array;
>>> }
>>>
>>> Obviously, one issue is that because the string is immutable, 
>>> I can't modify it directly, and so I actually build an 
>>> entirely new string in place. I would have just made a 
>>> mutable duplicate of the input and modify that, but then I 
>>> would get errors returning, because it expects string[] and 
>>> not char[][]. Is there a more elegant way to do what I'm 
>>> doing?
>>
>>
>> A few points:
>>
>> by declaring a new string and appending to it you are risking 
>> a lot of allocations. Either use std.array.appender or 
>> allocate the array with the correct size at the beginning.
>>
>> using .array on the end of the ufcs chain is yet another 
>> allocation. It can be avoided using std.algorithm.copy to copy 
>> the result back in to 'line'
>>
>> In my opinion the whole API would be better as range-based:
>>
>> auto splitSentence(R)(R input)
>>    if(isInputRange!R)
>> {
>>    return input
>>           .map!(c => (c == "\n"[0] || c == "\r"[0]) ? ' ' : 
>> c.toLower)
>>           .splitter!(' ')
>>           .filter!(a => !(a.empty));
>> }
>
> sorry, ignore that attempt, it's woefully broken...

Re: weird literal syntax, you didn't happen to be using dpaste to 
test and have trouble with character literals, did you?  Because 
I did and thought I was going insane until realized DPaste was 
broken.


More information about the Digitalmars-d-learn mailing list