On Sunday, 11 August 2013 at 16:26:16 UTC, Andrei Alexandrescu wrote:
On 8/8/13 9:52 AM, Jonathan M Davis wrote:
On Thursday, August 08, 2013 07:29:56 H. S. Teoh wrote:
Seems this thread has quietened down. So, what is the conclusion? Seems like almost everyone concedes that silent deprecation is the way to go. We still support string lambdas in the background, but in public docs we
promote the use of the new lambda syntax. Would that be a fair
assessment of this discussion?

I find it interesting that very few Phobos devs have weighed in on the matter, but unfortunately, most of the posters who have weighed in do seem to be
against keeping them.

There's a related issue that I think we must solve before deciding whether or not we should deprecate string lambdas. Consider:

void main() {
    import std.range;
    SortedRange!(int[], "a > b") a;
    SortedRange!(int[], "a > b") b;
    b = a;
    SortedRange!(int[], (a, b) => a > b) c;
    SortedRange!(int[], (a, b) => a > b) d;
    d = c;
}

The last line fails to compile because D does not currently have a good notion of comparing lambdas for equality. In contrast, string comparison is well defined, and although string lambdas have clowny issues with e.g. "a>b" being different from "a > b", people have a good understanding of what to do to get code working.

So I think we should come up with a good definition of what comparing two function aliases means.


Andrei

Correct me if I'm wrong, but AFAICT the old behavior was an undocumented feature. I couldn't find string lambdas formally documented anywhere, but lambdas are.

Comparing function aliases is an optimization, not a feature, so I don't feel it's a blocker to deprecating string lambdas. If the user needs the old behavior, he/she can do this today with an actual function:

    bool gt(int a, int b) {
        return a > b;
    }

    void main() {
        import std.range;
        SortedRange!(int[], "a > b") a;
        SortedRange!(int[], "a > b") b;
        b = a;
        SortedRange!(int[], gt) c;
        SortedRange!(int[], gt) d;
        d = c;
    }

While not as concise, this is safer and does not rely on undocumented behavior.

Another consideration, are the following equivalent?

    (a,b) => a > b
    (b,c) => b > c

Reply via email to