What is this error message telling me?

bluecat via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Apr 11 08:22:40 PDT 2017


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.


More information about the Digitalmars-d-learn mailing list