digitalmars.D.learn - problems with DPL example.
- %u (27/27) Oct 10 2011 Hello. I'm having problems compiling the following:
- simendsjo (8/35) Oct 10 2011 Seems some functionality was moved in 2.052. From std.string documentati...
- %u (31/38) Oct 10 2011 symbols
- Justin Whear (4/5) Oct 10 2011 with
- %u (37/37) Oct 10 2011 Thanks. It works, but I get something weird in the output. I get
- bearophile (5/8) Oct 10 2011 Try:
- simendsjo (4/12) Oct 10 2011 Shouldn't the original way work too?
- bearophile (5/8) Oct 10 2011 I think debug symbols should be present on default, to produce a nice st...
- %u (9/17) Oct 10 2011 nice stack trace on default, and be disabled with a compiler switch
- Steven Schveighoffer (8/22) Oct 12 2011 This is a bug in the C runtime that D uses, where pipes are not used
- Shripad K (18/43) Mar 13 2012 Boy its really hard to navigate this forum for an old thread.
- Jonathan M Davis (2/2) Oct 10 2011 You should checkout out this page: http://erdani.com/tdpl/errata/
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.
Oct 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
Oct 10 2011
== Quote from simendsjo (simendsjo gmail.com)'s articleSeems some functionality was moved in 2.052. From std.stringdocumentation:"IMPORTANT NOTE: Beginning with version 2.052, the followingsymbolshave been generalized beyond strings and moved to differentmodules."And "split Use std.array.split instead" std.array includes both split and splitter. http://www.d-programming-language.org/phobos/std_array.html#splitOkay, 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!
Oct 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;
Oct 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.
Oct 10 2011
%u:D>echo hello | wordcount2.exe < wordcount2.d 0 hello std.stdio.StdioException std\stdio.d(2156): Bad file descriptorTry: wordcount2.exe < wordcount2.d Bye, bearophile
Oct 10 2011
On 10.10.2011 21:38, bearophile wrote:%u:Shouldn't the original way work too? Another point: I recommend compiling with debug symbols as it gives you a nice stacktrace.D>echo hello | wordcount2.exe< wordcount2.d 0 hello std.stdio.StdioException std\stdio.d(2156): Bad file descriptorTry: wordcount2.exe< wordcount2.d Bye, bearophile
Oct 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
Oct 10 2011
== Quote from bearophile (bearophileHUGS lycos.com)'s articlesimendsjo:gives youShouldn't the original way work too?I don't remember.Another point: I recommend compiling with debug symbols as itnice stack trace on default, and be disabled with a compiler switch :-)a nice stacktrace.I think debug symbols should be present on default, to produce aBye, bearophileIf 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!
Oct 10 2011
On Mon, 10 Oct 2011 15:42:26 -0400, simendsjo <simendsjo gmail.com> wrote:On 10.10.2011 21:38, bearophile wrote:This is a bug in the C runtime that D uses, where pipes are not used correctly. I'm working on getting Walter to fix it as it's needed for the new std.process as well.%u:D>echo hello | wordcount2.exe< wordcount2.d 0 hello std.stdio.StdioException std\stdio.d(2156): Bad file descriptorYes, but the main difference is, bearophile's method simply opens a file, which FILE * obviously supports no problem. Your method creates a process with a pipe as the input. -SteveTry: wordcount2.exe< wordcount2.d Bye, bearophileShouldn't the original way work too?
Oct 12 2011
Boy its really hard to navigate this forum for an old thread. Seems like a lot has changed in D since this thread. Here is the correct snippet if someone comes searching for "error: undefined identifier splitter" like me :) (using DMD64 D Compiler v2.058) import std.stdio, std.string, std.algorithm; void main() { ulong[string] dictionary; foreach(line; stdin.byLine()) { foreach(word; splitter(strip(line))) { if(word in dictionary) continue; auto newID = dictionary.length; dictionary[word.idup] = newID; writeln(newID, '\t', word); } } } On Wednesday, 12 October 2011 at 15:39:14 UTC, Steven Schveighoffer wrote:On Mon, 10 Oct 2011 15:42:26 -0400, simendsjo <simendsjo gmail.com> wrote:On 10.10.2011 21:38, bearophile wrote:This is a bug in the C runtime that D uses, where pipes are not used correctly. I'm working on getting Walter to fix it as it's needed for the new std.process as well.%u:D>echo hello | wordcount2.exe< wordcount2.d 0 hello std.stdio.StdioException std\stdio.d(2156): Bad file descriptorYes, but the main difference is, bearophile's method simply opens a file, which FILE * obviously supports no problem. Your method creates a process with a pipe as the input. -SteveTry: wordcount2.exe< wordcount2.d Bye, bearophileShouldn't the original way work too?
Mar 13 2012
You should checkout out this page: http://erdani.com/tdpl/errata/ - Jonathan M Davis
Oct 10 2011