August 04, 2009
MIURA Masahiro Wrote:

> Andrei Alexandrescu wrote:
> > http://www.reddit.com/r/programming/comments/975ng/diving_into_the_d_programming_language_tdpl/
> 
> Thanks for sharing it!
> 
> Typos: in section 1.1, there are inchPerFoot's and inchperfoot's.

And, of course, the same goes for cmperinch's.

Some other observations are the following:

In section 1.2 you refer to prior "if" statements introduced in above samples, what samples? is there maybe a 0 chapte?r

In section 1.4, subsection "Building a Vocabulary" it's not very clear what stdio.byLine is... I mean, it says nothing about how to feed the text to the program. Also in subsection "Counting Frequencies. Lambda Functions" there appears a call to "splitter" function, isn't it named "split" instead? Besides the hamlet.txt URL doesn't work already, maybe a bit of indirection here would also be appreciated...

In section 1.5, maybe I miss the reason of importing "std.range".

In section 1.6, "stats" is a variable and stats.d is the name of the file/module, shouldn't stats.d be renamed to stat.d so that "stat.Max" makes sense and so the name of the program becomes stat and it's invoked that way in the command line? Or maybe rename "stat.Max" to "stats.Max"? Besides, aren't you talking firstly about Min? Why not to illustrate the thing with "stat.Min" instead of "stat.Max"?

In the references to different other chapters the word sometimes appears capitalized and sometimes doesn't.

Cheers!
August 04, 2009
Pablo Ripolles wrote:
> MIURA Masahiro Wrote:
> 
>> Andrei Alexandrescu wrote:
>>> http://www.reddit.com/r/programming/comments/975ng/diving_into_the_d_programming_language_tdpl/ 
>> Thanks for sharing it!
>>
>> Typos: in section 1.1, there are inchPerFoot's and inchperfoot's.
> 
> And, of course, the same goes for cmperinch's.
> 
> Some other observations are the following:
> 
> In section 1.2 you refer to prior "if" statements introduced in above samples, what samples? is there maybe a 0 chapte?r
> 
> In section 1.4, subsection "Building a Vocabulary" it's not very clear what stdio.byLine is... I mean, it says nothing about how to feed the text to the program. Also in subsection "Counting Frequencies. Lambda Functions" there appears a call to "splitter" function, isn't it named "split" instead? Besides the hamlet.txt URL doesn't work already, maybe a bit of indirection here would also be appreciated...
> 
> In section 1.5, maybe I miss the reason of importing "std.range".
> 
> In section 1.6, "stats" is a variable and stats.d is the name of the file/module, shouldn't stats.d be renamed to stat.d so that "stat.Max" makes sense and so the name of the program becomes stat and it's invoked that way in the command line? Or maybe rename "stat.Max" to "stats.Max"? Besides, aren't you talking firstly about Min? Why not to illustrate the thing with "stat.Min" instead of "stat.Max"?
> 
> In the references to different other chapters the word sometimes appears capitalized and sometimes doesn't.
> 
> Cheers!

Thanks, Pablo.

Andrei
August 09, 2009
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)[]
August 09, 2009
On Sat, Aug 8, 2009 at 8:44 PM, Jos van Uden<jvu@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..
August 09, 2009
Jarrett Billingsley wrote:
> On Sat, Aug 8, 2009 at 8:44 PM, Jos van Uden<jvu@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
1 2
Next ›   Last »