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