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.

Reply via email to