reddit.com: first Chapter of TDPL available for free

Jos van Uden jvu at nospam.nl
Sat Aug 8 18:44:40 PDT 2009


Jarrett Billingsley wrote:
> On Sat, Aug 8, 2009 at 8:44 PM, Jos van Uden<jvu at nospam.nl> wrote:
>> Andrei Alexandrescu wrote:
>>>
>>> http://www.reddit.com/r/programming/comments/975ng/diving_into_the_d_programming_language_tdpl/
>>>
>>> (Don't tell anyone, but I plan to rewrite it.)
>>>
>>> Andrei
>> Is this supposed to compile? I keep getting error messages.
>>
>> import std.stdio, std.string;
>>
>> void main() {
>>   uint[string] dic;
>>   foreach (line; stdin.byLine) {
>>      // Break sentence into words
>>      string[] words = split(strip(line));
>>      // Add each word in the sentence to the vocabulary
>>      foreach (word; words) {
>>         if (word in dic) continue; // nothing to do
>>         uint newID = dic.length;
>>         dic[word] = newID;
>>         writeln(newID, '\t', word);
>>      }
>>   }
>> }
>>
>>
>> test.d(7): Error: function std.string.split (immutable(char)[] s) does not
>> match parameter types (char[])
>> test.d(7): Error: cannot implicitly convert expression (strip(line)) of type
>> char[] to immutable(char)[]
>> test.d(7): Error: expected 2 function arguments, not 1
>>
>>
>> I've changed the code to:
>>
>> import std.stdio;
>> import std.string;
>>
>> void main() {
>>
>>    uint[string] dic;
>>    foreach (line; stdin.byLine) {
>>        string[] words = split(strip!(string)(line));
>>        foreach (word; words) {
>>            if (word in dic) {
>>                continue;
>>            }
>>            uint newID = dic.length;
>>            dic[word] = newID;
>>            writeln(newID, '\t', word);
>>        }
>>    }
>> }
>>
>> but I still get an error...
>>
>> test.d(12): Error: cannot implicitly convert expression (line) of type
>> char[] to immutable(char)[]
>>
> 
> It's not documented, but the .byLine method returns char[], not
> immutable(char)[] (string).  This is because the 'line' variable is
> reused on each new line of the input, to improve speed.  I think to
> solved this, you should use:
> 
> auto words = split(strip(line.idup));
> 
> The .idup creates a new duplicate of the line that is immutable.
> 
> Now, why split() doesn't take a const(char)[] is beyond me..

Yep, that solves it, in both cases.

Jos


More information about the Digitalmars-d-announce mailing list