Jump to page: 1 2
Thread overview
problems with DPL example.
Oct 10, 2011
%u
Oct 10, 2011
simendsjo
Oct 10, 2011
%u
Oct 10, 2011
Justin Whear
Oct 10, 2011
%u
Oct 10, 2011
bearophile
Oct 10, 2011
simendsjo
Oct 10, 2011
bearophile
Oct 10, 2011
%u
Mar 13, 2012
Shripad K
Oct 10, 2011
Jonathan M Davis
October 10, 2011
Hello.  I'm having problems compiling the following:

// From chapter 1 of D Programming Language.
//
import std.stdio, std.string;

void main() {
  uint[string] dictionary;

  foreach( line; stdin.byLine()) {
    // Break sentence into words
    // Add each word in the sentence to the vocabulary
    foreach( word; splitter(strip(line))) {
      if( word in dictionary) continue; // Nothing to do.
      auto newID = dictionary.length;
      dictionary[word] = newID;
      writeln( newid, '\t', word);
    }
  }
  return;
}



$ dmd wordcount.d
wordcount.d(9): Error: undefined identifier splitter



$ dmd -v
DMD32 D Compiler v2.055
Copyright (c) 1999-2011 by Digital Mars written by Walter Bright
Documentation: http://www.digitalmars.com/d/2.0/index.html


I am doing the examples in cygwin.

Anyone know what the problem is?


thanks.


October 10, 2011
On 10.10.2011 19:55, %u wrote:
> Hello.  I'm having problems compiling the following:
>
> // From chapter 1 of D Programming Language.
> //
> import std.stdio, std.string;
>
> void main() {
>    uint[string] dictionary;
>
>    foreach( line; stdin.byLine()) {
>      // Break sentence into words
>      // Add each word in the sentence to the vocabulary
>      foreach( word; splitter(strip(line))) {
>        if( word in dictionary) continue; // Nothing to do.
>        auto newID = dictionary.length;
>        dictionary[word] = newID;
>        writeln( newid, '\t', word);
>      }
>    }
>    return;
> }
>
>
>
> $ dmd wordcount.d
> wordcount.d(9): Error: undefined identifier splitter
>
>
>
> $ dmd -v
> DMD32 D Compiler v2.055
> Copyright (c) 1999-2011 by Digital Mars written by Walter Bright
> Documentation: http://www.digitalmars.com/d/2.0/index.html
>
>
> I am doing the examples in cygwin.
>
> Anyone know what the problem is?
>
>
> thanks.
>
>

Seems some functionality was moved in 2.052. From std.string documentation:
"IMPORTANT NOTE: Beginning with version 2.052, the following symbols have been generalized beyond strings and moved to different modules."
And
"split	Use std.array.split instead"

std.array includes both split and splitter.
http://www.d-programming-language.org/phobos/std_array.html#split
October 10, 2011
== Quote from simendsjo (simendsjo@gmail.com)'s article
> Seems some functionality was moved in 2.052. From std.string
documentation:
> "IMPORTANT NOTE: Beginning with version 2.052, the following
symbols
> have been generalized beyond strings and moved to different
modules."
> And
> "split	Use std.array.split instead"
> std.array includes both split and splitter.
> http://www.d-programming-language.org/phobos/std_array.html#split



Okay, thanks for that.  I added the extra module, and found I made a typo.  So I corrected that too.  Anyways, I am now having another problem.  What can I do to fix it? :




import std.stdio, std.string, std.array;

void main() {
  uint[string] dictionary;

  foreach( line; stdin.byLine()) {
    // Break sentence into words
    // Add each word in the sentence to the vocabulary
    foreach( word; splitter(strip(line))) {
      if( word in dictionary) continue; // Nothing to do.
      auto newID = dictionary.length;
      dictionary[word] = newID;
      writeln( newID, '\t', word);
    }
  }
  return;
}




$ dmd wordcount.d
wordcount.d(12): Error: associative arrays can only be assigned
values with immutable keys, not char[]


$ dmd -v
DMD32 D Compiler v2.055
Copyright (c) 1999-2011 by Digital Mars written by Walter Bright
Documentation: http://www.digitalmars.com/d/2.0/index.html
Usage:




thanks!
October 10, 2011
You need to create an immutable copy of word before using it as a key. That is, replace this line:

>       dictionary[word] = newID;

with
   dictionary[word.idup] = newID;

October 10, 2011
Thanks. It works, but I get something weird in the output.  I get the problem if I run it in a dos prompt or in a cygwin prompt:

Microsoft Windows [Version 6.1.7600]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

D>echo hello | wordcount2.exe
0       hello
std.stdio.StdioException@std\stdio.d(2156): Bad file descriptor
----------------
42A910
42A787
40318A
40239C
402141
403798
4037D7
4033D3
465D71
----------------


Do you know what this is caused by?

thanks.

Here's the code again:


import std.stdio, std.string, std.array;

void main() {
  uint[string] dictionary;

  foreach( line; stdin.byLine()) {
    // Break sentence into words
    // Add each word in the sentence to the vocabulary
    foreach( word; splitter(strip(line))) {
      if( word in dictionary) continue; // Nothing to do.
      auto newID = dictionary.length;
      dictionary[word.idup] = newID;
      writeln( newID, '\t', word);
    }
  }
  return;
}


thanks.
October 10, 2011
%u:

> D>echo hello | wordcount2.exe < wordcount2.d
> 0       hello
> std.stdio.StdioException@std\stdio.d(2156): Bad file descriptor

Try:

wordcount2.exe < wordcount2.d

Bye,
bearophile
October 10, 2011
On 10.10.2011 21:38, bearophile wrote:
> %u:
>
>> D>echo hello | wordcount2.exe<  wordcount2.d
>> 0       hello
>> std.stdio.StdioException@std\stdio.d(2156): Bad file descriptor
>
> Try:
>
> wordcount2.exe<  wordcount2.d
>
> Bye,
> bearophile

Shouldn't the original way work too?

Another point: I recommend compiling with debug symbols as it gives you a nice stacktrace.
October 10, 2011
simendsjo:

> Shouldn't the original way work too?

I don't remember.


> Another point: I recommend compiling with debug symbols as it gives you a nice stacktrace.

I think debug symbols should be present on default, to produce a nice stack trace on default, and be disabled with a compiler switch :-)

Bye,
bearophile
October 10, 2011
== Quote from bearophile (bearophileHUGS@lycos.com)'s article
> simendsjo:
> > Shouldn't the original way work too?
> I don't remember.
> > Another point: I recommend compiling with debug symbols as it
gives you
> > a nice stacktrace.
> I think debug symbols should be present on default, to produce a
nice stack trace on default, and be disabled with a compiler switch :-)
> Bye,
> bearophile


If I use file indirection instead of piping output to the d program, it works in cygwin window.

I'm not a dos expert, so I don't know how to do the same test on windows.

anyways, thanks!

October 10, 2011
You should checkout out this page: http://erdani.com/tdpl/errata/

- Jonathan M Davis
« First   ‹ Prev
1 2