Re: What is this error message telling me?

2017-04-11 Thread bluecat via Digitalmars-d-learn

On Tuesday, 11 April 2017 at 14:51:44 UTC, Anonymous wrote:
I was watching a dconf presentation from last year and wanted 
to try this out: https://github.com/luismarques/parnas72. It 
doesn't compile / run as it is and the problem seems to be in 
the function below.


import std.algorithm;
import std.range;
import std.uni;
/// Performs [["foo", "bar"], ["baz"]] -> ["baz", "foo bar"]
auto alphabetized(Range)(Range range)
{
return range
.map!(line => line.joiner(" "))
.array
.sort!((a, b) => icmp(a, b) < 0);
}

void main()
{
auto a = alphabetized([["foo", "bar"], ["baz"]]);
}


More specifically, icmp doesn't seem to be allowed as the 
predicate for sort:


Here's the error message I get:

C:\D\dmd2\windows\bin\..\..\src\phobos\std\uni.d(7082): Error: 
function 'std.algorithm.searching.skipOver!(Result, 
dstring).skipOver' is not nothrow
C:\D\dmd2\windows\bin\..\..\src\phobos\std\uni.d(7055): Error: 
nothrow function 'std.uni.fullCasedCmp!(Result).fullCasedCmp' 
may throw
C:\D\dmd2\windows\bin\..\..\src\phobos\std\uni.d(7136): Error: 
template instance std.uni.fullCasedCmp!(Result) error 
instantiating

test.d(14):instantiated from here: icmp!(Result, Result)
C:\D\dmd2\windows\bin\..\..\src\phobos\std\algorithm\sorting.d(1851):
instantiated from here: __lambda3!(Result, Result)
test.d(14):instantiated from here: sort!((a, b) => 
icmp(a, b) < 0, cast(SwapStrategy)0, Result[])
test.d(19):instantiated from here: 
alphabetized!(string[][])

C:\D\dmd2\windows\bin\..\..\src\phobos\std\algorithm\sorting.d(1863): Error: static 
assert  "Invalid predicate passed to sort: __lambda3"
test.d(14):instantiated from here: sort!((a, b) => 
icmp(a, b) < 0, cast(SwapStrategy)0, Result[])
test.d(19):instantiated from here: 
alphabetized!(string[][])



My question is, how do I begin to understand error messages 
like the above? I looked at the signature for sort and icmp and 
don't get what the problem is.


Thanks.


The following code gives you the output you want:

//code starts
import std.algorithm: joiner, map, sort, cmp;
import std.array: array;

auto alpha(T)(T[][] range) {
return range
.map!(line => line.joiner(" "))
.array
.sort!((a,b) => cmp(a, b) < 0);
}

void main() {
  import std.stdio;
  auto a = alpha!string([["foo", "bar"], ["baz"]]);
  a.writeln;
}
//code ends

I really don't know why your program gave you any errors, but I 
can tell you my thinking process. Immediately the first thing I 
noticed was that your function parameters didn't look explicit at 
all, so I tried to make them more explicit here. Next, i noticed 
the use of icmp was the problem in the error message. I thought 
maybe that function was outdated or something, so i decided to 
use the comparison function in std.algorithm. Third, I used 
selective importing in case the compiler got confused what 
functions to use.


All and all, for me, I read the error messages from the bottom 
up. Also I usually use functions found in std.algorithm because 
they seem for stable for me.


Re: reading from file

2016-12-13 Thread bluecat via Digitalmars-d-learn

On Tuesday, 13 December 2016 at 15:42:16 UTC, Namal wrote:
Hello, comming from C++, I find it hard to remember and 
understand how reading from file should be done in D. 
Especially since I am not very good in functional programming. 
So I have a file which looks like this:


1,2,3,4
5,6,7,8
9,11,11,12

and so on

How could I read it row by row and create an array accordingly 
without reading the comma?


import std.stdio;
import std.string:strip;
import std.algorithm: splitter, each;
import std.array: array;

void main() {
  //prepare variables
  File file = File("new.txt", "r");
  string[] arr;

  //read file
  while(!file.eof) {
file
  .readln
  .strip
  .splitter(",")
  .array
  .each!(n => arr ~= n);
  }
  arr.writeln;
}

//here is my attempt. copy, paste, run the program to see if it 
is what you want.
//feel free to ask any questions about my code, it isn't perfect 
but it works.